服務是運行在後臺的一段代碼。它能夠運行在它本身的進程,也能夠運行在其餘應用程序進程的上下文(context)裏面,這取決於自身的須要。其它的組件能夠綁定到一個服務(Service)上面,經過遠程過程調用(RPC)來調用這個方法。例如媒體播放器的服務,當用戶退出媒體選擇用戶界面,仍然但願音樂依然能夠繼續播放,這時就是由服務 (service)來保證當用戶界面關閉時音樂繼續播放的。 android
它跟Activity的級別差很少,可是他不能本身運行,須要經過某一個Activity或者其餘Context對象來調用, Context.startService() 和Context.bindService()。
兩種啓動Service的方式有所不一樣。這裏要說明一下的是若是你在Service的onCreate或者onStart作一些很耗時間的事情,最好在Service裏啓動一個線程來完成,由於Service是跑在主線程中,會影響到你的UI操做或者阻塞主線程中的其餘事情。
何時須要Service呢?好比播放多媒體的時候用戶啓動了其餘Activity這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記錄你地理信息位置的改變等等。 spa
1.第一種是經過調用Context.startService()啓動,調用Context.stopService()結束,startService()能夠傳遞參數給Service。 線程
2.第二種方式是經過調用Context.bindService()啓動,調用Context.unbindservice()結束,還能夠經過ServiceConnection訪問Service。 對象
兩者能夠混合使用,好比說我能夠先startService再bindservice。 接口
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方法可能會重複調用屢次。 it
stopService的時候直接onDestroy,若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後能夠經過stopService關閉Service。 io
因此調用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在一個生命週期中只能被調用一次。