從系統看startService的生命週期

一、簡介

完整的客戶端生命週期: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
在這裏插入圖片描述

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