从系统看bindService的生命周期

一、简介

完整的客户端生命周期:onCreate() → onBind() → unbindService → onUnbind() → onDestroy()

二、bindService的流程

从系统看bindService的生命周期
8-12 Service的onCreate流程

14-20 Service的onBind流程

22-27 ServiceConnection的connected流程

InnerConnection == LoadedApkServiceDispatcherServiceDispatcherInnerConnection

bindServiceLocked

  • 一些flags的校验
  • retrieveServiceLocked 检索Service
  • 查看app是否需要permission review,需要则启动相应的actiivty,并处理callback
  • 调用ServiceRecord的retrieveAppBindingLocked检索,并创建ConnectionRecord
  • bringUpServiceLocked 拉起Service

requestServiceBindingLocked

  • 发送bind超时消息
  • 强制提升app的优先级到PROCESS_STATE_SERVICE
  • 让客户端开启bind流程

三、unbindService的流程

从系统看bindService的生命周期
5-8 Service的onUnbind流程 ,当存在多个进程采用同一个intent bind某个service,那么必须等到所有的进程都执行了unbind操作,才能真正unbind。

11-16 ServiceConnection的disconnected流程

17-20 Service的onDestroy的流程 , 当service是通过startService方式所启动,那么必须通过stopService或者stopSelf()才能destroy该服务,任何的unbindService 是无法destroy该服务;

当servce时通过bindService带有flags Context.BIND_AUTO_CREATE方式启动的,那么unbind过程会判断如果该service的其他ConnectionRecord都不存在设置BIND_AUTO_CREATE,则会直接destroy该service;如果存在一个,则不会destroy