1. Service是什么?
2. 啟動方式
1). 差異
2). 關(guān)聯(lián)
3. 生命周期
1). startService
2). bindService
4.本地服務(wù)與遠程服務(wù)
5.IntentService
6.重啟機制
Service是什么淆院?
作為Android四大組件之一牢贸,Service是一種沒有可視化界面的長生命周期后臺服務(wù),常用于處理一些耗時后臺任務(wù)拍嵌,如:文件操作遭赂,播放音樂,網(wǎng)絡(luò)訪問等横辆。它無法與用戶直接進行交互撇他,一般通過Activity間接的實現(xiàn)用戶交互。
啟動方式
service啟動有兩種方式:startService與bindService狈蚤,啟動后分別對應(yīng)兩種狀態(tài): “started”與“bound”困肩。兩者既可獨立使用,又可混合使用脆侮。
差異
1. 與調(diào)用者的關(guān)系
通過startService啟動后锌畸,service與啟動它的調(diào)用者不存在關(guān)聯(lián),調(diào)用者不可以使用service中的任何方法靖避,同時潭枣,調(diào)用者銷毀后,service仍然存在筋蓖。
而通過bindService啟動卸耘,service與調(diào)用者存在關(guān)聯(lián),一旦調(diào)用者掛了粘咖,service也會跟著銷毀蚣抗。
2. 啟動與結(jié)束
通過startService啟動,通過stopService方法后來停止瓮下,或者通過service.stopSelf()方或者service.stopSelfResult()來停止自身翰铡。無論有多少次startService,只要又一次stopService即可停止讽坏。
通過bindService啟動锭魔,需要通過unbindService解除綁定,或者當調(diào)用者Context銷毀時路呜,service也會銷毀(同時使用了startService啟動了的service除外迷捧,此時context銷毀,service與之的綁定關(guān)系也不存在了漠秋,但是service還是繼續(xù)存活),service可以通過bindService來綁定多個context庆锦。通過bindservice啟動的服務(wù),stopService不會立即停止搂抒,只有當所有的綁定關(guān)系都結(jié)束后艇搀,才會停止服務(wù)。
關(guān)聯(lián)
startService和bindService并不是相斥的焰雕,它們可以混合使用。
通過startService啟動的服務(wù)淀散,還是可以通過bindService進行綁定,此時蚜锨,服務(wù)只有解除所有的綁定關(guān)系后档插,stopService才能起到停止服務(wù)的作用。
而bindService啟動服務(wù)后亚再,同樣還是可以startService,此時調(diào)用unBindService才終止服務(wù)氛悬。(可以參考生命周期推薦的兩篇文章)
生命周期
關(guān)于service的生命周期,這兩篇博文分析得很全面:
有關(guān)Service的startService與bindService在各種情形下生命周期的變化
Android:Service生命周期最全面解析
這里簡單說一下:
- 通過startService啟動后棍现,service生命周期包含onCreate--onStartCommand--onDestroy
注意:
1). service被多次startService, onCreate僅調(diào)用一次镜遣,之后都只調(diào)用onStartCommand
2). onStartCommand的調(diào)用次數(shù)即startService的次數(shù)
- 通過bindService啟動后,service生命周期包含onCreate--onBind--onUnbind
注意:
1). service被多次bindService, onBind僅調(diào)用一次悲关,之后都只調(diào)用
2). 使用bindService時,一般我們會用到onServiceConnected寓辱,但是有時會可能出現(xiàn)不調(diào)用的情況,可以檢查下在onBind方法是否返回了IBinder
3). 要使用好bindService進行交互诱鞠,最好先了解下Binder相關(guān)機制挎挖,這里不多說般甲,推薦一個博客鹅颊,可以看看:http://gityuan.com/2015/10/31/binder-prepare/
本地服務(wù)與遠程服務(wù)
在AndroidManifest.xml中申明service時,定義屬性android:process=":remote"后锚烦,這個service就變成了一個遠程服務(wù)帝雇,那么,遠程服務(wù)和普通的服務(wù)有什么區(qū)別呢尸闸?
最簡單明顯的區(qū)別是,遠程服務(wù)吮廉,調(diào)用者與服務(wù)不運行在同一個進程內(nèi),這就涉及到跨進程通信問題(IPC及AIDL)宙址。而本地服務(wù)與調(diào)用者運行在同一個進程调卑。
參考 Android:遠程服務(wù)Service(含AIDL & IPC講解)以及上面提到的 Binder機制博客
IntentService
IntentService被稱為“用完即走”服務(wù),是一種Service和HandlerThread的結(jié)合體恬涧,完成任務(wù)后即自動停止,適合于處理與UI無關(guān)的任務(wù)溯捆。
當IntentService被多次調(diào)用時,會多次調(diào)用onHandleIntent现使,以串行的方式依次執(zhí)行任務(wù),執(zhí)行完畢自動停止顽冶。
IntentService應(yīng)當使用startService方式啟動售碳,其onBind方法返回為null强重,如果使用bindService方式啟動,則可能不能進入到onHandleIntent佃声,從而僅相當于普通的service倘要。
重啟機制
https://blog.csdn.net/hehui1860/article/details/41743549 這篇文章分析了service重啟機制的源碼。
具體在service編寫時封拧,可以通過控制onStartCommand返回參數(shù)來實現(xiàn)重啟
相關(guān)的保活問題可以參考http://www.reibang.com/p/2272b9d42172
個人博客: IT老五
微信公眾號:【IT老五(it-lao5)】曹铃,一起源創(chuàng)捧杉,一起學(xué)習(xí)!
ps: 作為重新系統(tǒng)復(fù)習(xí)Android的第二篇筆記味抖,寫完后發(fā)現(xiàn)這篇文章很多內(nèi)容都是附上了鏈接,這里僅僅做了系統(tǒng)的介紹蜕着,具體內(nèi)容可以點擊相關(guān)鏈接去深入红柱。(偷懶了罒ω罒)