什麼是Service :
Service,看名字就知道跟正常理解的“服務”差不多,後台運行,可互動這樣的一個東西。它跟Activity的層級差不多,但是他
不能自己運行,需要通過某一個Activity或者其他Context對象來調用, Context.startService() 和 Context.bindService()。
兩種啟動Service的方式有所不同 :
如果在Service的onCreate或者onStart做一些很耗時間的事情,最好在 Service裡啟動一個線程來完成,因為Service是跑在主
線程中,會影響到UI操作或者阻塞主線程中的其他事情。
什麼時候需要Service :
比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記
錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。
如何使用Service :
Service的調用
Context.startService():Service會經曆onCreate -> onStart(如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次 );stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行。該Service的調用者再啟動起來後可以通過stopService關閉Service。 注意,多次調用Context.startservice()不會嵌套(即使會有相應的onStart()方法被調用),所以無論同一個服務被啟動了多少次,一旦調用Context.stopService()或者stopSelf(),他都會被停止。補充說明:傳遞給startService()的 Intent對象會傳遞給onStart()方法。調用順序為:onCreate --> onStart(可多次調用) --> onDestroy。
Context.bindService():Service會經曆onCreate() -> onBind(),onBind將返回給用戶端一個IBind介面執行個體,IBind允許用戶端回調服務的方法,比如得到Service啟動並執行狀態或其他動作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用 onUnbind -> onDestroyed相應退出,所謂綁定在一起就共存亡了 。
補充說明:傳遞給bindService()的Intent對象會傳遞給onBind(),傳遞給unbindService()的Intent對象會傳遞給onUnbind()方法。 調用順序為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。
注意事項:在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他 onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。還有一點,目前我沒有遇到過需要 startService和bindService互動使用的情況(我認為不會有這種需求),所以不必去考慮互動的問題,待遇到時再考慮不遲。
adcastReceiver只能通過startService啟動Service ,因為廣播本身生命週期很短,bind的話沒有意義
Service的生命週期 :
Service的生命週期方法比Activity少一些,只有onCreate, onStart, onDestroy我們有兩種方式啟動一個Service,他們對Service
生命週期的影響是不一樣的。
1 通過startService
Service會經曆 onCreate -> onStart stopService的時候直接onDestroy
如果是調用者(TestServiceHolder)自己直接退出而沒有調用stopService的話,Service會一直在後台運行。
下次TestServiceHolder再起來可以stopService。
2 通過bindService
Service只會運行onCreate, 這個時候 TestServiceHolder 和TestService綁定在一起
TestServiceHolder 退出了,Srevice就會調用onUnbind->onDestroyed所謂綁定在一起就共存亡了