从系统看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
在这里插入图片描述

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