1. Service有哪些啟動方法?有什麼區別?
什麼是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的生命周期 : www.2cto.com
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所謂綁定在一起就共存亡了。
其實還有第三種,就是跨進程通信:AIDL。這也可以啟動服務。