1. 程式人生 > >Android--四大元件之Service

Android--四大元件之Service

####1. Service是什麼?
####2. 啟動方式
######1). 差異
######2). 關聯
####3. 生命週期
######1). startService
######2). bindService
####4.本地服務與遠端服務
####5.IntentService
####6.重啟機制

#Service是什麼?
作為Android四大元件之一,Service是一種沒有視覺化介面的長生命週期後臺服務,常用於處理一些耗時後臺任務,如:檔案操作,播放音樂,網路訪問等。它無法與使用者直接進行互動,一般通過Activity間接的實現使用者互動。
#啟動方式
service啟動有兩種方式:startService與bindService,啟動後分別對應兩種狀態: “started”與“bound”。兩者既可獨立使用,又可混合使用。
###差異
#####1. 與呼叫者的關係
通過startService啟動後,service與啟動它的呼叫者不存在關聯,呼叫者不可以使用service中的任何方法,同時,呼叫者銷燬後,service仍然存在。
而通過bindService啟動,service與呼叫者存在關聯,一旦呼叫者掛了,service也會跟著銷燬。
#####2. 啟動與結束
通過startService啟動,通過stopService方法後來停止,或者通過service.stopSelf()方或者service.stopSelfResult()來停止自身。無論有多少次startService,只要又一次stopService即可停止。
通過bindService啟動,需要通過unbindService解除繫結,或者當呼叫者Context銷燬時,service也會銷燬(同時使用了startService啟動了的service除外,此時context銷燬,service與之的繫結關係也不存在了,但是service還是繼續存活),service可以通過bindService來繫結多個context。通過bindservice啟動的服務,stopService不會立即停止,只有當所有的繫結關係都結束後,才會停止服務。
###關聯
startService和bindService並不是相斥的,它們可以混合使用。
通過startService啟動的服務,還是可以通過bindService進行繫結,此時,服務只有解除所有的繫結關係後,stopService才能起到停止服務的作用。
而bindService啟動服務後,同樣還是可以startService,此時呼叫unBindService才終止服務。(可以參考生命週期推薦的兩篇文章)
#生命週期
關於service的生命週期,這兩篇博文分析得很全面:

有關Service的startService與bindService在各種情形下生命週期的變化
Android:Service生命週期最全面解析
這裡簡單說一下:

  1. 通過startService啟動後,service生命週期包含onCreate–onStartCommand–onDestroy

注意:
1). service被多次startService, onCreate僅呼叫一次,之後都只調用onStartCommand
2). onStartCommand的呼叫次數即startService的次數

  1. 通過bindService啟動後,service生命週期包含onCreate–onBind–onUnbind

注意:
1). service被多次bindService, onBind僅呼叫一次,之後都只調用
2). 使用bindService時,一般我們會用到onServiceConnected,但是有時會可能出現不呼叫的情況,可以檢查下在onBind方法是否返回了IBinder
3). 要使用好bindService進行互動,最好先了解下Binder相關機制,這裡不多說,推薦一個部落格,可以看看:http://gityuan.com/2015/10/31/binder-prepare/
#本地服務與遠端服務
在AndroidManifest.xml中申明service時,定義屬性android:process=":remote"後,這個service就變成了一個遠端服務,那麼,遠端服務和普通的服務有什麼區別呢?
最簡單明顯的區別是,遠端服務,呼叫者與服務不執行在同一個程序內,這就涉及到跨程序通訊問題(IPC及AIDL)。而本地服務與呼叫者執行在同一個程序。
參考

Android:遠端服務Service(含AIDL & IPC講解)以及上面提到的 Binder機制部落格
#IntentService
IntentService被稱為“用完即走”服務,是一種Service和HandlerThread的結合體,完成任務後即自動停止,適合於處理與UI無關的任務。
當IntentService被多次呼叫時,會多次呼叫onHandleIntent,以序列的方式依次執行任務,執行完畢自動停止。
IntentService應當使用startService方式啟動,其onBind方法返回為null,如果使用bindService方式啟動,則可能不能進入到onHandleIntent,從而僅相當於普通的service。
#重啟機制
https://blog.csdn.net/hehui1860/article/details/41743549 這篇文章分析了service重啟機制的原始碼。
具體在service編寫時,可以通過控制onStartCommand返回引數來實現重啟
相關的保活問題可以參考https://www.jianshu.com/p/2272b9d42172

原文:簡書ThinkinLiu 部落格: IT老五

ps: 作為重新系統複習Android的第二篇筆記,寫完後發現這篇文章很多內容都是附上了連結,這裡僅僅做了系統的介紹,具體內容可以點選相關連結去深入。(偷懶了罒ω罒)