兩種Service--本地Service/遠程Service
本地service:是和當前應用在同一個進程中的service,彼此之間擁有共同的內存區域,所以對于某些數據的共享特別的方便和簡單;
遠程service:主要牽扯到不同進程間的service訪問。因為android的系統安全的原因導致了我們在不同的進程間無法使用一般的方式共享數據。在這里android為我們提供了一個AIDL工具。(android interface description language)android接口描述語言。
Service生命周期
onCreate()->onStart()->onBind()->onUnbind()->onDestroy() :
(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);
conn則是一個代表與service連接狀態的類,當我們連接service成功或失敗時,會主動觸發其內部的onServiceConnected或onServiceDisconnected方法。如果我們想要訪問service中的數據,可以在onServiceConnected()方法中進行實現
使用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方法不會調用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。