1. 程式人生 > >Service具體解釋(二):Service生命周期

Service具體解釋(二):Service生命周期

art views parent con 周期 使用 down append ini

《 Service具體解釋(一):什麽是Service》
《 Service具體解釋(二):Service生命周期》
《Service具體解釋(三):Service的使用》
《Service具體解釋(四):綁定服務 與 通信》
《Service具體解釋(五):使用Messager進行通信》
《Service具體解釋(六):進程間通信-AIDL》

與Activity相似,Service也有自己的生命周期函數,在不同的時刻。系統會調用相應的Service生命周期函數,只是與Activity聲明周期相比,Service的聲明周期更加簡單。我們通過官方給出的一張圖片來體會一下:

技術分享

這裏我們總結一下:

1). 被啟動的服務的生命周期:假設一個Service被某個Activity 調用 Context.startService 方法啟動。那麽無論是否有Activity使用bindService綁定或unbindService解除綁定到該Service。該Service都在後臺執行。假設一個Service被startService 方法多次啟動,那麽onCreate方法僅僅會調用一次,onStart將會被調用多次(相應調用startService的次數),而且系統僅僅會創建Service的一個實例(因此你應該知道僅僅須要一次stopService調用)。該Service將會一直在後臺執行。而無論相應程序的Activity是否在執行,直到被調用stopService,或自身的stopSelf方法。

當然假設系統資源不足,android系統也可能結束服務。

2). 被綁定的服務的生命周期:假設一個Service被某個Activity 調用 Context.bindService 方法綁定啟動,無論調用 bindService 調用幾次,onCreate方法都僅僅會調用一次。同一時候onStart方法始終不會被調用。當連接建立之後,Service將會一直執行,除非調用Context.unbindService 斷開連接或者之前調用bindService 的 Context 不存在了(如Activity被finish的時候)。系統將會自己主動停止Service,相應onDestroy將被調用。

3). 被啟動又被綁定的服務的生命周期:假設一個Service又被啟動又被綁定。則該Service將會一直在後臺執行。而且無論怎樣調用。onCreate始終僅僅會調用一次,相應startService調用多少次。Service的onStart便會調用多少次。調用unbindService將不會停止Service。而必須調用 stopService 或 Service的 stopSelf 來停止服務。

4). 當服務被停止時清除服務:當一個Service被終止(1、調用stopService;2、調用stopSelf;3、不再有綁定的連接(沒有被啟動))時。onDestroy方法將會被調用,在這裏你應當做一些清除工作。如停止在Service中創建並執行的線程。

特別註意:

1、你應當知道在調用 bindService 綁定到Service的時候,你就應當保證在某處調用 unbindService 解除綁定(雖然 Activity 被 finish 的時候綁定會自      動解除。而且Service會自己主動停止);

2、你應當註意 使用 startService 啟動服務之後。一定要使用 stopService停止服務。無論你是否使用bindService。

3、同一時候使用 startService 與 bindService 要註意到。Service 的終止,須要unbindService與stopService同一時候調用,才幹終止 Service。無論 startService 與 bindService 的調用順序,假設先調用 unbindService 此時服務不會自己主動終止,再調用 stopService 之後服務才會停止。假設先調用 stopService 此時服務也不會終止,而再調用 unbindService 或者 之前調用 bindService 的 Context 不存在了(如Activity 被 finish 的時候)之後服務才會自己主動停止。

4、當在旋轉手機屏幕的時候,當手機屏幕在“橫”“豎”變換時。此時假設你的 Activity 假設會自己主動旋轉的話,旋轉事實上是 Activity 的又一次創建。因此旋轉之前的使用 bindService 建立的連接便會斷開(Context 不存在了),相應服務的生命周期與上述同樣。

5、在 sdk 2.0 及其以後的版本號中,相應的 onStart 已經被否決變為了 onStartCommand,只是之前的 onStart 任然有效。

這意味著,假設你開發的應用程序用的 sdk 為 2.0 及其以後的版本號,那麽你應當使用 onStartCommand 而不是 onStart。

生命周期方法說明

onStartCommand()
當還有一個組件(如 Activity)通過調用 startService() 請求啟動服務時,系統將調用此方法。一旦執行此方法。服務即會啟動並可在後臺無限期執行。 假設您實現此方法,則在服務工作完畢後。須要由您通過調用 stopSelf() 或 stopService() 來停止服務。(假設您僅僅想提供綁定,則無需實現此方法。)

onBind()
當還有一個組件想通過調用 bindService() 與服務綁定(比如執行 RPC)時,系統將調用此方法。在此方法的實現中,您必須通過返回 IBinder 提供一個接口,供client用來與服務進行通信。請務必實現此方法,但假設您並不希望同意綁定,則應返回 null。

onCreate()
首次創建服務時。系統將調用此方法來執行一次性設置程序(在調用 onStartCommand() 或 onBind() 之前)。假設服務已在執行,則不會調用此方法。

onDestroy()
當服務不再使用且將被銷毀時,系統將調用此方法。

服務應該實現此方法來清理全部資源,如線程、註冊的偵聽器、接收器等。

這是服務接收的最後一個調用。

Service具體解釋(二):Service生命周期