Service詳解

Service 詳解

service說明

service是一個可以在後臺長時間執行的應用組件,不會向用戶提供界面,其他的應用組件可以啓動一個service,即使用戶選擇了另一個程序,這個service還是會繼續運行,另外,一個組件可以和一個service綁定,甚至進行進程間的交流,舉個例子:一個servic可以網路處理,播放音樂,執行I/O文件流,

一個service有以下兩種重要的啓動方式

Started

當一個應用組件啓動一個service靠調用StartService()一個Service就被Started了,一旦開始,即使啓動這個Service的組件被銷燬,但service也可以在後臺無限期的運行,通常,一個Started 服務執行一個單個的操作,並且不會返回結果給調用者,舉個例子:當通過網絡下載或上傳一個文件,當這個操作完成之後,這個service也會自我停止

Bound

當一個應用組件調用bindService()時,一個Service就被Bound了,一個bound的Service會提供一個允許組件和service交互的client-service接口,發送數據,得到結果,甚至進行進程間的交流,一個bound的Service只有被其他的應用組件綁定纔會運行,多種組件可以同時綁定service,但當沒有一個組件綁定時,這個service就會被銷燬

儘管這兩種啓動方式是分開說的,但是他們可以別同時使用,這隻看你是否實現了onStartCommend()回調方法允許組件去start這個service,和onBind()方法允許去bound

警告;

一個service運行在宿主進程的主線程,這個Service不會自己創建一個自己的線程,並且不會在不同的進程裏運行(除非你特殊指明),這意味着如果你的service將要佔用很多的CPU或運行阻塞操作(如:MP3回放歌曲),你應該在Servic創建一個新的線程,靠使用一個分開的線程,你將要減小應用程序ANR(應用程序無響應)的情況,並且你的組件可以繼續在主線程裏運行

基礎:

爲了創建一個service,你必須創建一個繼承Service(或是他的子類),並且,必須實現一些回調方法去管理處理service的生命週期,如果合適的話,下面這些重要的回調方法你應該實現

onStartCommend()

當其他的組件(例如:activity)要求service被Started時,系統將調用這個方法靠調用startService(),一旦這個方法被執行了,這個service將在後臺被無限期的運行,如果你實現了這個方法,你所有義務的停止servic,靠調用stopSelf()或者stopService()(如果你只想提供bound的Service,則不需要實現此方法)

onBind()

當其他的組件想要bound一個Service,系統將調用這個方法,靠bindService(),如果你實現了這個方法,你必須返回一個IBinder來提供一個供客戶端和service進行交互的接口,如果你不繫那個允許被綁定,你可以一返回null

onCreate()

當service第一次被執行系統將調用這個方法去執行一次性的設置工作,如果這個service已經運行,這個方法將不會被調用

onDestroy()

當這個service不再被使用並且將要被銷燬的時候,系統將調用這個方法,你可以聲明這個方法去清除線程,註冊監聽器,接收器等等,這個是service接收的最後一個回調方法

只有系統內存很少和必須歸還系統內存時,系統纔會強力停止一個Service,如果一個service被Bound到一個用戶正在用的activity,那麼有很少的機率系統會停止Service,吐過這個service被聲明在前臺運行,那麼它將幾乎不會被殺死,如果系統殺死了你的service,只要資源變得再一次可以利用的話,系統h會重新開始這個service

在manifest裏聲明一個service

和Activity等其他組件一樣,你必須在manifest裏聲明你的所有service,添加方法在<application>屬性裏添加M<service>屬性,舉個例子

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>
爲了確保你的app是安全的,總是使用一個明確的intent去started或bind你的Service並且不要在聲明intent filters在<service>,如果必須要用一些不明確的組件來start一個service,你必須爲你的service提供一個intent filter文件並且提供排除組件名稱,然後你也必須用setPackage()爲intent設置一個包,爲目標service提供足夠的消除歧義的說明

另外,你可以確保你的service只能有你的app調用,方法就是;添加<android:exported>並設置爲“false”


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章