从系统看startService的生命周期

    技术2022-07-11  119

    一、简介

    完整的客户端生命周期: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

    Processed: 0.010, SQL: 9