Service的啓動、綁定,以及生命週期的筆記

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機制了。

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