天天看點

Android--四大元件之ServiceService是什麼?啟動方式生命周期本地服務與遠端服務IntentService重新開機機制

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的第二篇筆記,寫完後發現這篇文章很多内容都是附上了連結,這裡僅僅做了系統的介紹,具體内容可以點選相關連結去深入。(偷懶了罒ω罒)