兩種Service--本地Service/遠程Service
本地service:是和當前應用在同一個進程中的service,彼此之間擁有共同的內存區域,因此對於某些數據的共享特別的方便和簡單;
遠程service:主要牽扯到不一樣進程間的service訪問。由於android的系統安全的緣由致使了咱們在不一樣的進程間沒法使用通常的方式共享數據。在這裏android爲咱們提供了一個AIDL工具。(android interface description language)android接口描述語言。android
Service生命週期安全
onCreate()->onStart()->onBind()->onUnbind()->onDestroy() :ide
(1)啓動/中止方式--startService/stopService
startService(Intent intent):啓動一個service
stopService(Intent intent) :中止一個service 工具
(2)綁定/解綁定方式--bindService/unBindService
若是咱們想使用service中的一些數據或者訪問其中的一些方法,那麼咱們就要經過下面的方法:
public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;
public void unbindService(ServiceConnection conn);spa
conn則是一個表明與service鏈接狀態的類,當咱們鏈接service成功或失敗時,會主動觸發其內部的onServiceConnected或onServiceDisconnected方法。若是咱們想要訪問service中的數據,能夠在onServiceConnected()方法中進行實現 xml
使用Service的步驟對象
(1)繼承service類,實現本身的service。
若是想要訪問service中的某些值,咱們一般會在Service類中再提供一個繼承了Binder的內部類,經過onBind()方法返回給service請求。這裏實際上巧妙的利用了內部類可以訪問外部類屬性的特色。
(2)在androidManifest.xml中進行註冊,如:
<!-- service配置開始 -->
<service android:name="MyService"></service>
<!-- service配置結束-->
(3)在activity中進行啓動、綁定、解綁或者中止service。
啓動/中止(startService/stopService)方式比較簡單;下面列出一個Activity綁定/解綁(bindService/unbindService)Service並使用Service中數據的例子。繼承
bindService的使用介紹接口
(1)service經過Context.startService()方法開始,經過Context.stopService()方法中止;也能夠經過Service.stopSelf()方法或者Service.stopSelfResult()方法來中止本身。只要調用一次stopService()方法即可以中止服務,不管以前它被調用了多少次的啓動服務方法。生命週期
(2)客戶端創建一個與Service的鏈接,並使用此鏈接與Service進行通話,經過Context.bindService()方法來綁定服務,Context.unbindService()方法來關閉服務。多個客戶端能夠綁定同一個服務,若是Service還未被啓動,bindService()方法能夠啓動服務。
(3)上面startService()和bindService()兩種模式是徹底獨立的。你能夠綁定一個已經經過startService()方法啓動的服務。例如:一 個後臺播放音樂服務能夠經過startService(intend)對象來播放音樂。可能用戶在播放過程當中要執行一些操做好比獲取歌曲的一些信息,此時 activity能夠經過調用bindServices()方法與Service創建鏈接。這種狀況下,stopServices()方法實際上不會中止 服務,直到最後一次綁定關閉。
Service綁定流程
context.bindService() ——> onCreate() ——> onBind() ——> Service running ——> onUnbind() ——> onDestroy() ——> Service stop
(1)onBind()將返回給客戶端一個IBind接口實例,IBind容許客戶端回調服務的方法,好比獲得Service的實 例、運行狀態或其餘操做。這個時候把調用者(Context,例如Activity)會和Service綁定在一塊兒,Context退出 了,Srevice就會調用onUnbind->onDestroy相應退出。
(2)因此調用bindService的生命週期爲:onCreate --> onBind(只一次,不可屢次綁定) --> onUnbind --> onDestory。
(3)在Service每一次的開啓關閉過程當中,只有onStart可被屢次調用(經過屢次startService調用),其餘onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。
(4)這個問題當調用bindService方法後就會回調Activity的onServiceConnected,在這個方法中會向Activity中傳遞一個IBinder的實例,Acitity須要保存這個實例。在Service中須要建立一個實現IBinder的內部類(這個內部類不必定在Service中實現,但必須在Service中建立它)。在OnBind()方法中需返回一個IBinder實例,否則onServiceConnected方法不會調用。