圖解Service的兩種啓動方式

圖解Service的兩種啓動方式

衆所周知,Service有兩種啓動方式
在這裏插入圖片描述

.
.
.

一.在新進程啓動Service

在新進程啓動Service共分爲5個步驟:

step1:

App向AMS發送一個啓動Service的消息,從AIDL視角看是這個樣子的:
service
圖中client代表了App端,APP通過AMN/AMP將要啓動的service信息發送給了AMS。

Step2:

AMS檢查Service是否在Manifest中聲明瞭,沒聲明會直接報錯。

AMS檢查啓動Service的進程是否存在,如果不存在,先把Service信息存下來,然後創建一個新的進程。

在AMS中,每個Service,都使用ServiceRecord對象來保存。

Step3:

新進程啓動後,也會創建新的ActivityThread,然後把ActivityThread對象通過AMP傳遞給AMS,告訴AMS,新進程啓動成功了。

Step4:

AMS把傳進來的ActivityThread對象改造爲ApplicationThreadProxy,也就是ATP,通過ATP,把要啓動的Service信息發送給新進程。

Step5:

新進程通過ApplicationThread接收到AMS的信息,和前面介紹的啓動Activity的最後一步相同,藉助於ActivityThread和H,執行Service的onCreate方法。在此期間,爲Service創建了Context上下文對象,並與Service相關聯。
在這裏插入圖片描述
這裏的H與Activity啓動過程中的H是同一個Handler類…到這裏在新進程中啓動service成功了
.
.
.

二.在當前進程中啓動Service

相比上面的過程,在當前進程啓動Service就簡單多了:
1.App向AMS請求啓動Service

2.AMS例行檢查,比如Service是否聲明瞭,把Service在AMS這邊註冊。AMS發現要啓動的Service就是App所在的Service,就通知App啓動這個Service。

3…Service啓動成功
.
.

三.在當前進程綁定新啓動的Service

Step1.APP向AMS請求綁定Service

Step2.AMS例行檢查,比如Service是否聲明瞭,把Service在AMS這邊註冊。AMS發現要啓動的Service就是App所在的Service,就通知App對Service進行綁定。

Step3.App收到AMS的第一個消息,啓動Service

Step4.App收到AMS第二條消息,綁定service,並將一個binder傳給AMS

Step5.AMS收到binder後,將其發送給APP

Step6.APP收到binder對象,Service啓動成功

Step1:
在這裏插入圖片描述
step5,6:
在這裏插入圖片描述
圖片是自己畫的,地址是:ProcessOn

四.IntentSerivice與Service的區別

首先我們清楚,Service雖然叫做後臺服務,但是Service中卻並不可以做耗時操作,否則會出現ANR異常。
所以多數情況下我們只能不斷的在service中開闢線程,利用新的新線程去做 耗時操作。但這樣做的缺點就是服務會在後臺一直運行,想要停止只能手動調用stopService()方法,或者stopself()方法。於是Android給我們提供了IntentService。

IntentService的特點:

  1. IntentService內部有一個工作線程,專門用來處理耗時操作,所以我們不需要在IntentService中去開闢線程。
  2. IntentService當任務完成後,會自己停止。
  3. IntentService 維護了一個工作隊列。所以我們可以多次啓動IntentService ,它會將每個耗時操作存放在工作隊列中,然後再IntentService 的 onHandleIntent 回調方法中執行,每次只會有一個工作線程去處理耗時操作,執行完之後再執行下一個
  4. IntentService的啓動方式與普通Service相同

本文參考:
https://www.jianshu.com/p/058d35e01dd1

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