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.comService的生命週期方法比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。這也可以啟動服務。