Android 5.0 startService的启动流程最全面的分析

1、service的启动过程从ContextWrapper的startService开始
这里写图片描述
其中mBase是ContextImpl实例

2、ContextImpl的startService
这里写图片描述

startService调用startServiceComon
这里写图片描述
通过ActivityManagerNative.getDefault().startService来启动一个服务
其中ActivityManagerNative.getDefault()是一个ActivityManagerService对象

3、ActivityManagerService(简称AMS)的startService
AMS通过mServices对象的startServiceLocked来完成后续的启动过程
mServices是ActiveService实例,ActiveService是用来协助AMS管理service的类
这里写图片描述

4、ActiveService的startServiceLocked
里面有两个重要的方法:retrieveServiceLocked和startServiceInnerLocked。
retrieveServiceLocked方法是用来解析传进来的service这个Intent,就是解析AndroidManifest.xml定义的Service标签的intent-filter相关内容,然后将解析结果放在ServiceRecord中,ServiceRecord一直贯穿整个Service的启动过程中。
这里写图片描述

startServiceInnerLocked通过调用bringUpServiceLocked函数继续完成Service的后续启动过程。
这里写图片描述

5、ActiveService的bringUpServiceLocked
这时要分两种情况分析:Service启动有开启新的进程和Service启动没有开启新的进程。通过boolean isolate(单独的)参数判断,如果isolate为false,即Service不是在独立的进程启动的没有开启新进程,是在主进程(应用进程)启动的。
直接执行realStartServiceLocked函数(跳转到步骤10)
这里写图片描述

如果isolate为true,则service是开启新的进程启动的,即AndroidManifest.xml定义的Service标签有设置android:process
这里写图片描述
其中procName就是AndroidManifest.xml定义的Service标签的android:process的值
然后通过startProcessLocked函数来开启进程
这里写图片描述

6、ActivityManagerService的startProcessLocked
调用Process.start来创建一个新的进程,指定执行android.app.ActivityThread这个类
这里写图片描述

7、ActivityThread
执行ActivityThread的main函数
这里写图片描述
在Android应用程序中,每一个进程对应一个ActivityThread实例,所以,这个函数会创建一个thread实例,然后调用ActivityThread.attach函数进一步处理。
attach函数会调用attachApplication进一步处理
这里写图片描述
其中ActivityManagerNative.getDefault()是一个ActivityManagerService对象
所以进入ActivityManagerService的attachApplication函数

8、ActivityManagerService的attachApplication
attachApplication又调用attachApplicationLocked函数
这里写图片描述
attachApplicationLocked又调用mServices.attachApplicationLocked
mServices是ActiveService实例,ActiveService是用来协助AMS管理service的类
这里写图片描述

9、ActiveService的attachApplicationLocked
attachApplicationLocked执行realStartServiceLocked函数
这里写图片描述

10、ActiveService的realStartServiceLocked
调用app.thread.scheduleCreateService
这里写图片描述
这里的app.thread是一个ApplicationThread对象的远程接口,它是在上面的步骤7创建ActivityThread对象时作为ActivityThread对象的成员变量同时创建的,然后在步骤8中传过来的。然后调用这个远程接口的scheduleCreateService函数回到原来的ActivityThread对象中执行启动服务的操作。

11、ApplicationThread的scheduleCreateService
(ApplicationThread是ActivityThread的内部类)
通过发消息给Handler H来完成启动
这里写图片描述

12、ActivityThread的Handler H
通过Handler H的handleCreateService来完成Service的最终启动
这里写图片描述

13、ActivityThread的handleCreateService
通过类加载器创建Service实例
这里写图片描述
然后创建ContextImpl实例,并且通过Service.attach方法建立两者之间的关系。
最后通过Service.onCreate()启动服务。
这里写图片描述

添加service已经启动执行onStartCommand方法的分析

如果步骤5 执行ActiveService的bringUpServiceLocked时service已经启动了
则通过sendServiceArgsLocked执行Service的onStartCommand方法。
这里写图片描述
sendServiceArgsLocked调用app.thread.scheduleServiceArg函数
这里写图片描述
这里的app.thread是一个ApplicationThread对象
所以进入ApplicationThread的scheduleServiceArg函数
这里写图片描述
通过发消息给Handler H来完成,然后执行handleServiceArgs
这里写图片描述
handleServiceArgs中调用s.onStartCommand来完成Service的onStartCommand方法的调用。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值