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方法的调用。