在Activity中调用startService启动某个Service的流程如下所示:
![](https://img.haomeiwen.com/i5328002/03255f92074c0025.png)
在调用Activity.startService的时候实际上是调用的ContextImpl.startService,ContextImpl.startService会调用startServiceCommon方法,如下所示:
![](https://img.haomeiwen.com/i5328002/56eff91e4394272d.png)
startServiceCommon中会调用ActivityManagerNativite.startService,也就是调用的ActivityManagerService.startService,通过binder方式将要启动的Service信息传给SystemServer进程。
![](https://img.haomeiwen.com/i5328002/3ee434d7980c7fe0.png)
AMS的startService函数中会将启动service交给mServices对象,该对象的实现为ActiveService。调用ActiveService.startServiecLocked方法。
![](https://img.haomeiwen.com/i5328002/55c14d4cf3ddd7ec.png)
ActiveService.startServiecLocked中调用retrieveServiceLocked来查找目标Service的信息,查找时先在本地的ServiceMap查询,查找不到就到PackageManagerService中查询(App安装后所有的组件信息都在PMS中保存了),最终取得ServiceLookupResult。之后会继续调用startServiceInnerLocked:
![](https://img.haomeiwen.com/i5328002/f7f12456100abbdf.png)
startServiceInnerLocked继续调用bringUpServiceLocked,该方法实现如下:
![](https://img.haomeiwen.com/i5328002/2fe0122fe3b579d3.png)
bringUpServiceLocked首先去获取Service所在的进程信息,然后调用realStartServiceLocked:
![](https://img.haomeiwen.com/i5328002/4d646e2f23899742.png)
realStartServiceLocked会调用目标进程的ApplicationThread.scheduleCreateService函数,最终运行ActivityThread.handleCreateService来创建Service对象。
![](https://img.haomeiwen.com/i5328002/79f32139d4adf114.png)
ActivityThread.handleCreateService通过反射创建了Service对象,并调用onCreate方法和attach方法。最终调用AMS.serviceDoneExecuting结束startService的流程。
网友评论