一、簡介
完整的客戶端生命週期:onCreate() → onStartCommand() → stopService → onDestroy()
如果存在多個client啓動同一個service, 只需一個client便可以stop該服務
二、startService的流程
8-10 是進程不存在時才執行,且中間省略了進程創建的流程
12-16 Service的onCreate流程
11-17 是Service不存在時才執行,即service存在app端只用執行onStartCommand方法
18-23 Service的onStartCommand流程
startServiceLocked
- retrieveServiceLocked 檢索得到Service實例
- 一些前臺或後臺啓動的權限校驗
- 非前臺caller&非前臺service ,procState在PROCESS_STATE_SERVICE之上或進程不存在,則設置addToStarting爲true,startServiceInnerLocked 方法中會用到這個變量
- 非前臺caller&非前臺service,procState在PROCESS_STATE_RECEIVER之上或進程不存在,如果mStartingBackground 列表大小超過mMaxStartingBackground,則當前service添加到mDelayedStartList列表,當前service延遲啓動,mMaxStartingBackground值若沒有通過屬性設置,低內存設備爲1,否則爲8
- 調用startServiceInnerLocked
retrieveServiceLocked
- 檢索 service,存在則獲取,不存在則創建
- startServiceInnerLocked
- 如果addToStarting 爲true,添加Service到mStartingBackground列表,並設置service的startingBgTimeout 時間爲15s後
bringUpServiceLocked
- 若Service已經存在,則直接通過sendServiceArgsLocked 讓客戶端Service回調onStartCommand方法
- 從restart list中移除當前service; 取消service的delay ;設置package的stop狀態爲false
- 進程存在則直接調用realStartServiceLocked去繼續下面的操作
- 進程不存在,創建進程,並把service添加到mPendingServices,等創建進程時再start
realStartServiceLocked
- 真正啓動Service的地方,拉起app的service實例,bindservice也會調到這個方法
- 給service實例設置app,restartTime,lastActivity等
- 更新oomadj,reason爲OOM_ADJ_REASON_START_SERVICE
- 告知app create service,執行Service的onCreate方法,並post"create"超時消息
- 告知app start service,執行Service的onStartCommand方法,並post “start”超時消息
三、stopService的流程
如果存在多個client啓動同一個service, 只需一個client便可以stop該服務
1、Service外部stop
stopServiceLocked
如果service是delay的,則設置service的delayedStop 爲true,在Service被拉起的時候stop
2、service 內部stop