標籤:
9.4 服務的生命週期
之前章節我們學習過了活動以及片段的生命週期。類似地,服務也有自己的生命週期, 前面我們使用到的 onCreate()、onStartCommand()、onBind()和 onDestroy()等方法都是在服務的生命週期內可能回調的方法。
一旦在項目的任何位置調用了 Context 的 startService()方法,相應的服務就會啟動起來, 並回調 onStartCommand()方法。如果這個服務之前還沒有建立過,onCreate()方法會先於 onStartCommand() 方法執行。服務啟動了之後會一直保持運行狀態,直到 stopService()或 stopSelf()方法被調用。注意雖然每調用一次 startService()方法,onStartCommand()就會執行 一次,但實際上每個服務都只會存在一個執行個體。所以不管你調用了多少次 startService()方法, 只需調用一次 stopService()或 stopSelf()方法,服務就會停止下來了。
另外,還可以調用 Context 的 bindService()來擷取一個服務的持久串連,這時就會回調 服務中的 onBind()方法。類似地,如果這個服務之前還沒有建立過,onCreate()方法會先於 onBind()方法執行。之後,調用方可以擷取到 onBind()方法裡返回的 IBinder 對象的執行個體,這 樣就能自由地和服務進行通訊了。只要調用方和服務之間的串連沒有斷開,服務就會一直保 持運行狀態。
當調用了 startService()方法後,又去調用 stopService()方法,這時服務中的 onDestroy() 方法就會執行,表示服務已經銷毀了。類似地,當調用了 bindService()方法後,又去調用 unbindService()方法,onDestroy()方法也會執行,這兩種情況都很好理解。但是需要注意, 我們是完全有可能對一個服務既調用了 startService()方法,又調用了 bindService()方法的, 這種情況下該如何才能讓服務銷毀掉呢?根據 Android 系統的機制,一個服務只要被啟動或 者被綁定了之後,就會一直處於運行狀態,必須要讓以上兩種條件同時不滿足,服務才能被 銷毀。所以,這種情況下要同時調用 stopService()和 unbindService()方法,onDestroy()方法才 會執行。
這樣你就已經把服務的生命週期完整地走了一遍。
android: 服務的生命週期