Android 服務的生命週期
服務的生命週期
有了 Service 類我們如何啟動他呢,有兩種方法:
• Context.startService()
• Context.bindService()
1. 在同一個應用任何地方呼叫 startService() 方法就能啟動 Service 了,然後系統會回撥 Service 類的 onCreate() 以及 onStart() 方法。這樣啟動的 Service 會一直執行在後臺,直到 Context.stopService() 或者 selfStop() 方法被呼叫。另外如果一個 Service 已經被啟動,其他程式碼再試圖呼叫 startService() 方法,是不會執行 onCreate()
的,但會重新執行一次 onStart() 。
2. 另外一種 bindService() 方法的意思是,把這個 Service 和呼叫 Service 的客戶類綁起來,如果呼叫這個客戶類被銷燬,Service 也會被銷燬。用這個方法的一個好處是,bindService() 方法執行後 Service 會回撥上邊提到的 onBind() 方發,你可以從這裡返回一個實現了 IBind 介面的類,在客戶端操作這個類就能和這個服務通訊了,比如得到 Service 執行的狀態或其他操作。如果 Service 還沒有執行,使用這個方法啟動 Service 就會 onCreate() 方法而不會呼叫 onStart()。
總結:
1. startService()的目的是回撥onStart()方法,onCreate() 方法是在Service不存在的時候呼叫的,如果Service存在(例如之前呼叫了bindService,那麼Service的onCreate方法已經呼叫了)那麼startService()將跳過onCreate() 方法。
2. bindService()目的是回撥onBind()方法,它的作用是在Service和呼叫者之間建立一個橋樑,並不負責更多的工作(例如一個Service需要連線伺服器的操作),一般使用bindService來繫結到一個現有的Service(即通過StartService啟動的服務)。
由於Service 的onStart()方法只有在startService()啟動Service的情況下才呼叫,故使用onStart()的時候要注意這點。
與 Service 通訊並且讓它持續執行
如果我們想保持和 Service 的通訊,又不想讓 Service 隨著 Activity 退出而退出呢?你可以先 startService() 然後再 bindService() 。當你不需要繫結的時候就執行 unbindService() 方法,執行這個方法只會觸發 Service 的 onUnbind() 而不會把這個 Service 銷燬。這樣就可以既保持和 Service 的通訊,也不會隨著 Activity 銷燬而銷燬了。
提高 Service 優先順序
Android 系統對於記憶體管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控制程式的記憶體使用。當系統覺得當前的資源非常有限的時候,為了保 證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體。這樣就能保證真正對使用者有用的程式仍然再執行。如果你的 Service 碰上了這種情況,多半會先被殺掉。但如果你增加 Service 的優先順序就能讓他多留一會,我們可以用 setForeground(true) 來設定 Service 的優先順序。
為什麼是 foreground ? 預設啟動的 Service 是被標記為 background,當前執行的 Activity 一般被標記為 foreground,也就是說你給 Service 設定了 foreground 那麼他就和正在執行的 Activity 類似優先順序得到了一定的提高。當讓這並不能保證你得 Service 永遠不被殺掉,只是提高了他的優先順序。
摘自網路其他資料:關於Service生命周
Android Service生命週期與Activity生命週期是相似的,但是也存在一些細節上也存在著重要的不同:
onCreate和onStart是不同的
通過從客戶端呼叫Context.startService(Intent)方法我們可以啟動一個服務。如果這個服務還沒有執行,Android將啟動它並且在onCreate方法之後呼叫它的onStart方法。如果這個服務已經在執行,那麼它的onStart方法將被新的Intent再次呼叫。所以對於單個執行的Service它的onStart方法被反覆呼叫是完全可能的並且是很正常的。
onResume、onPause以及onStop是不需要的
回撥一個服務通常是沒有使用者介面的,所以我們也就不需要onPause、onResume或者onStop方法了。無論何時一個執行中的Service它總是在後臺執行。
onBind
如果一個客戶端需要持久的連線到一個服務,那麼他可以呼叫Context.bindService方法。如果這個服務沒有執行方法將通過呼叫onCreate方法去建立這個服務但並不呼叫onStart方法來啟動它。相反,onBind方法將被客戶端的Intent呼叫,並且它返回一個IBind物件以便客戶端稍後可以呼叫這個服務。同一服務被客戶端同時啟動和繫結是很正常的。
onDestroy
與Activity一樣,當一個服務被結束是onDestroy方法將會被呼叫。當沒有客戶端啟動或繫結到一個服務時Android將終結這個服務。與很多Activity時的情況一樣,當記憶體很低的時候Android也可能會終結一個服務。如果這種情況發生,Android也可能在記憶體夠用的時候嘗試啟動被終止的服務,所以你的服務必須為重啟持久儲存資訊,並且最好在onStart方法內來做。