Service的啟動、繫結,以及生命週期的筆記

一個暱稱而已T發表於2017-11-19

1、有關Service的startService與bindService在各種情形下生命週期的變化

參考:http://blog.csdn.net/qq_22804827/article/details/78609636

需要注意的是,startServicestopServicebindServiceunbindService方法都是Context的成員方法。

Android Developers文章參考:
https://developer.android.com/guide/components/bound-services.html?hl=zh-cn


2、有關onCreate()、onStart()、onBind()等生命週期方法所在的執行緒

以前面的情景為基礎,如果在兩個Activity分別開啟一個子執行緒,在其中去startService和bindService,此時,就算是在子執行緒中執行這兩個方法,但是有關Service的生命週期方法都還是會在主執行緒中執行。
簡單的說明原因,就是Service的生命週期方法的呼叫都有藉助到ActivityThread中的H(本質上是一個Handler),通過H的相關方法來實現的,而ActivityThread則是UI執行緒,即主執行緒。

具體原因可參見《Android藝術探索》的“Service的工作過程“章節。


3、startCommand()方法返回值

(1)START_STICKY = 1 ,當Service已經啟動後,如果startCommand方法返回值是這個,則表示如果記憶體不足Service被系統殺掉,系統會在後續記憶體空閒時嘗試著重新建立這個Service,但是不會再傳遞上次啟動Service時的Intent,onStartCommand中的Intent引數會為null。

(2)START_NOT_STICKY = 2 ,系統把Service殺掉後,不會嘗試重新建立這個Service。

(3)START_REDELIVER_INTENT = 3 ,系統把Service殺掉後,會嘗試重新建立這個Service,並且會把之前啟動Service的最後一個Intent重新傳遞回來。


4、有關bindService()方法的第三個引數

第三個引數是一個指示繫結選項的標誌。
由於本人暫時能力有限,無法完全正確理解某些標誌值的具體含義,翻閱一些部落格說得也是一知半解,有興趣的可以自行去看谷歌官方的文件,避免我在此誤導大家。
https://developer.android.com/reference/android/content/Context.html#BIND_AUTO_CREATE

Service的行為和執行模式,其中BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY兩個flag在Ice Cream Sandwich也就是Android4.0版本前後有一些區別,主要是: 
在4.0之前,Service的優先順序被預設視同後臺任務,如果設定了BIND_AUTO_CREATE則Service的優先順序將等同於宿主程式,也就是呼叫bindService的程式。 
在4.0及以上就完全變了,Service的優先順序預設等同於宿主程式,只有設定了BIND_WAIVE_PRIORITY才會使Service的被當做後臺任務對待,WAIVE就是放棄的意思嘛。 
基於上述區別,必須對不針對4.0以上開發的的App進行相容。這種App跑在4.0以上時,bindService的時候沒有同時設定BIND_AUTO_CREATE則Service應被視為後臺任務,那麼BIND_WAIVE_PRIORITY會被偷偷加上去。 

來自:http://blog.csdn.net/pan11115111/article/details/70236354


補充內容:

如果設定Service於一個單獨的程式(具體的設定方法為在AndroidManifest檔案中為<service/>標籤新增android:process屬性即可),則其生命週期方法會執行於新建的程式

具體原因需要參考Binder機制了。

相關文章