Android之Servie生命週期探索

Service的生命週期

1.Service生命週期的回調方法

        onCreate():首次創建Service;
        onStartCommand():當另一組件調用startService()啓動Service;
        onDestroy():當Service不再使用且將要銷燬;
        onBind():當另一組件調用bindService()與Service綁定時,系統將調用此方法;
        onUnbind():當另一組件調用unbindService()與Service解除綁定時系統將調用此方法;
        onRebind():當舊的組件與Service解綁後另一新組件與Service綁定,onUnbind()返回true時,系統將調用此方法;

2.非綁定模式

        第一次調用startService()時候執行的方法依次爲onCreate()、onStartCommand()、onStart(),當Service關閉的時候調用onDestroy();

調用
to
to
to
startService
onCreate
onStartCommand
onStart
onDestroy

        調用Context的startService()方法,相應的服務就會啓動起來,並回調 onStartCommand()方法。如果這個服務之前還沒有創建過,onCreate()方法會先於onStartCommand()方法執行。服務啓動了之後會一直保持運行狀態,直到stopService()或 stopSelf()方法被調用。
        雖然每調用一次startService()方法,onStartCommand()就會執行 一次,但實際上每個服務都只會存在一個實例。所以不管你調用了多少次 startService()方法,只需調用一次 stopService()或 stopSelf()方法,服務就會停止下來了。

3.綁定模式

        第一次調用bindService(),執行的方法依次爲onCreate()、onBind(),解除綁定的時候會執行onUnbind()、onDestroy()。

調用
to
to
to
bindService
onCreate
onBind
onUnbind
onDestroy

        調用 Context 的bindService()來獲取一個服務的持久連接,這時就會回調服務中的onBind()方法。類似地,如果這個服務之前還沒有創建過,onCreate()方法會先於 onBind()方法執行。之後,調用方可以獲取到 onBind()方法裏返回的 IBinder 對象的實例,這樣就能自由地和服務進行通信了。只要調用方和服務之間的連接沒有斷開,服務就會一直保持運行狀態。
        調用startService()後又去調用 stopService()方法,這時服務中的 onDestroy()方法就會執行,表示服務已經銷燬了。
        調用bindService()方法後,又去調用unbindService()方法,onDestroy()方法也會執行,這兩種情況都很好理解。


Service創建到銷燬生命週期過程

Start服務

        其他組件調用startService()創建然後保持運行,必須通過調用stopSelf()自行終止。其他組件也可以通過調用stopService()終止這類服務。服務終止後系統會把它銷燬。
        如果一個Service被startService()方法多次啓動,onCreate()方法也只調用一次,onStart()方法將會被多次調用,系統只會創建一個Service實例,所以stopService只需要調用一次就可以停止服務。該Service將會一直在後臺運行不管對應程序的Activity是否在運行,直到調用stopService(),或者自身調用stopSelf()。
        如果系統資源不足,Android系統也可能結束服務。

Bind服務

        調用bindService()創建,然後客戶通過一個IBinder接口與服務進行通信,客戶端可以通過unbindService()來關閉連接。多個客戶端可以綁定在同一個服務上,當所有的客戶端都解除綁定後,系統會銷燬服務(Bind服務不需要自行終止)。
        如果一個Service被某個Activity調用Context.bindService方法綁定啓動,不管調用bindService幾次,onCreate()方法都只會調用一次,同時onStart()方法始終不會被調用。當連接建立之後,Service將會一直運行,除非調用Context.unbindService()斷開連接或者之前調用bindService()的Context不存在了,系統將會自動停止Service,對應onDestroy()將被調用。
        可以綁定到一個已經用startService()啓動的服務上,這種情況stopService()或stopSelf()不會真的終止服務,除非所有的客戶端都解除了綁定。



onStartCommand()返回值介紹

        START_STICKY
        如果Service進程被Kill,保留Service的狀態爲開始狀態,但不保留遞送的Intent對象。隨後系統會嘗試重新創建Service,由於服務爲開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法,如果在此期間沒有任何啓動命令被傳遞到Service,那麼參數Intent將爲null;
        START_NOT_STICKY
        非黏性,使用這個返回值如果在執行完onStartCommand後Service被異常Kill,系統不會自動重啓該服務;
        START_REDELIVER_INTENT
        重傳Intent使用這個返回值,如果在執行完onStartCommand()後Service被異常Kill,系統會自動重啓該服務,將該Intent的值傳入。
        START_STICKY_COMPATIBILITY
        START_STICKY的兼容版本,不保證服務被Kill後一定能重啓;


onCreate()方法和onStartCommand()到底有什麼區別?

        Service的onCreate()和onStartCommand()方法的區別跟Activity的onCreate()和onStart()方法區別差不多。
        onCreate()方法是在Service第一次創建的時候調用的,onStartCommand()在每次啓動服務的時候都會調用,由於是第一次點擊 Start Service按鈕,Service此時還未創建過,所以兩個方法都會執行,之後如果你再連續多點擊幾次 Start Service按鈕,就只有 onStartCommand()方法可以得到執行了。


onRebind(Intent)在什麼情況下執行

        在onUnbind()方法返回true的情況下會執行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章