1. Service是什麼?
2. 啟動方式
1). 差異 2). 關聯3. 生命周期
1). startService 2). bindService4.本地服務與遠端服務
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生命周期最全面解析
這裡簡單說一下:
- 通過startService啟動後,service生命周期包含onCreate--onStartCommand--onDestroy
注意:
1). service被多次startService, onCreate僅調用一次,之後都隻調用onStartCommand
2). onStartCommand的調用次數即startService的次數
- 通過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的第二篇筆記,寫完後發現這篇文章很多内容都是附上了連結,這裡僅僅做了系統的介紹,具體内容可以點選相關連結去深入。(偷懶了罒ω罒)