Android 四大組件之Service 生命週期

service的生命週期

service 有兩種生命週期

  • 標準開啓模式 start service
    被開啓的service通過其他組件通過startService()來創建的,這種service會一直無限運行下去,除非調用stopSelf()和stopService()方法來停止它,當service被停止時,系統會銷燬它。

  • 綁定模式 bound service
    被綁定的Service是當其他組件(一個客戶)調用bindService()來創建的。客戶可以通過一個IBinder接口和service進行通信。客戶可以通過unbindService()來解綁,一個service可以同時和多個客戶綁定,當多個客戶全部解綁之後,系統會銷燬service。

  • Service的這兩中生命週期並不是完全分開的。
    也就是說,你可以和一個已經調用了 startService()而被開啓的service進行綁定。比如,一個後臺音樂service可能因調用 startService()方法而被開啓了,稍後,可能用戶想要控制播放器或者得到一些當前歌曲的信息,可以通過bindService()將一個activity和service綁定。這種情況下,stopService()或 stopSelf()實際上並不能停止這個service,除非所有的客戶都解除綁定。

Service的生命週期回調函數

和activity一樣,service也有一系列的生命週期回調函數,你可以實現它們來監測service狀態的變化,並且在適當的時候執行適當的工作。
下面的service展示了每一個生命週期的方法:

public class TestService extends Service {
    int mStartMode; // indicates how to behave if the service is killed
    IBinder mBinder; // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }

    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }

    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

Service的生命週期圖

這裏寫圖片描述

這個圖說明了service典型的回調方法,儘管這個圖中將開啓的service和綁定的service分開,但要記住,任何service都潛在地允許綁定。所以,一個被開啓的service仍然可能被綁定。實現這些方法,你可以看到兩層嵌套的service的生命週期.

整體生命週期

 service整體的生命時間是從onCreate()被調用開始,到onDestroy()方法返回爲止。
  和activity一樣,service在onCreate()中進行它的初始化工作,在onDestroy()中釋放殘留的資源。
  比如,一個音樂播放service可以在onCreate()中創建播放音樂的線程,在onDestory()中停止這個線程。
  onCreate() 和 onDestroy()會被所有的service調用,不論service是通過startService()還是bindService()建立。
積極活動的生命時間(The active lifetime)
  service積極活動的生命時間(active lifetime)是從onStartCommand() 或onBind()被調用開始,它們各自處理由startService()或 bindService()方法傳過來的Intent對象。
  如果service是被開啓的,那麼它的活動生命週期和整個生命週期一同結束。
  如果service是被綁定的,它們它的活動生命週期是在onUnbind()方法返回後結束。
  :儘管一個被開啓的service是通過調用 stopSelf() 或 stopService()來停止的,沒有一個對應的回調函數與之對應,即沒有onStop()回調方法。所以,當調用了停止的方法,除非這個service和客戶組件綁定,否則系統將會直接銷燬它,onDestory()方法會被調用,並且是這個時候唯一會被調用的回調方法。
管理生命週期
 當綁定service和所有客戶端解除綁定之後,Android系統將會銷燬它,(除非它同時被onStartCommand()方法開啓)。
  因此,如果你的service是一個純粹的綁定service,那麼你不需要管理它的生命週期。然而,如果你選擇實現onStartCommand()回調方法,那麼你必須顯式地停止service,因爲service此時被看做是開啓的。這種情況下,service會一直運行到它自己調用 stopSelf()或另一個組件調用stopService(),不論它是否和客戶端綁定。
  另外,如果你的service被開啓並且接受綁定,那麼當系統調用你的 onUnbind()方法時,如果你想要在下次客戶端綁定的時候接受一個onRebind()的調用(而不是調用 onBind()),你可以選擇在 onUnbind()中返回true。
  onRebind()的返回值爲void,但是客戶端仍然在它的 onServiceConnected()回調方法中得到 IBinder 對象。
  下圖展示了這種service(被開啓,還允許綁定)的生命週期:
  這裏寫圖片描述

這就是service的生命週期,下一章,我們做一個示例來學習怎樣調用android中的服務
發佈了56 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章