一 什麼是Service
服務是運行在背景一段代碼。它可以運行在它自己的進程,也可以運行在其他應用程式進程的上下文(context)裡面,這取決於自身的需要。其它的組件可以綁定到一個服務(Service)上面,通過遠端程序呼叫(RPC)來調用這個方法。例如媒體播放器的服務,當使用者退出媒體選擇使用者介面,仍然希望音樂依然可以繼續播放,這時就是由服務
(service)來保證當使用者介面關閉時音樂繼續播放的。
它跟Activity的層級差不多,但是他不能自己運行,需要通過某一個Activity或者其他Context對象來調用, Context.startService() 和Context.bindService()。
兩種啟動Service的方式有所不同。這裡要說明一下的是如果你在Service的onCreate或者onStart做一些很耗時間的事情,最好在Service裡啟動一個線程來完成,因為Service是跑在主線程中,會影響到你的UI操作或者阻塞主線程中的其他事情。
什麼時候需要Service呢?比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等。
二 如何使用Service
1.第一種是通過調用Context.startService()啟動,調用Context.stopService()結束,startService()可以傳遞參數給Service。
2.第二種方式是通過調用Context.bindService()啟動,調用Context.unbindservice()結束,還可以通過ServiceConnection訪問Service。
二者可以混合使用,比如說我可以先startService再bindservice。
三 service生命週期
startService後,即使調用startService的進程結束了,Service仍然還存在,直到有進程調用stopService,或者Service自己自殺(stopSelf())。bindService後,Service就和調用bindService的進程同生共死了,也就是說當調用bindService的進程死了,那麼它bind的Service也要跟著被結束,當然期間也可以調用unbindservice讓 Service結束。
兩種方式混合使用時,比如說你startService了,我bindService了,那麼只有你stopService了而且也unbindservice了,這個Service才會被結束。
Android系統將會嘗試保留那些啟動了的或者是綁定了服務的進程。如果該服務正在進程的onCreate(), onStart(), 或者 onDestroy() 這些方法中執行時, 那麼主進程將會成為一個前台進程,以確保此代碼不會被停止。如果服務已經開始,那麼它的主進程會就重要性而言低於所有可見的進程但高於不可見的進程, 由於只有少數幾個進程是使用者可見的,所以只要不是記憶體特別低,該服務不會停止.。如果有多個用戶端綁定了服務, 只要用戶端中的一個對於使用者是可見的,即認為該服務可見。
如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次。
stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行。該Service的調用者再啟動起來後可以通過stopService關閉Service。
所以調用startService的生命週期為:onCreate --> onStart(可多次調用) --> onDestroy
使用context.bindService()啟動Service會經曆:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
onBind將返回給用戶端一個IBind介面執行個體,IBind允許用戶端回調服務的方法,比如得到Service啟動並執行狀態或其他動作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。
所以調用bindService的生命週期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。
所以,在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。