在Activity中调用startService启动某个Service的流程如下所示:
![img_1033a0a2c305e1f09a5ca1f96f7cf38b.png](https://i-blog.csdnimg.cn/blog_migrate/7f41abd228d92716f4768bed2bd7f9de.png)
在调用Activity.startService的时候实际上市调用的ContextImpl.startService,ContextImpl.startService会地哦啊与startServiceCommon方法,如下所示:
![img_387b842811794736be1aa8dfc68d5de1.png](https://i-blog.csdnimg.cn/blog_migrate/ab134405b36cb538028c8643fd5f915f.png)
startServiceCommon中会调用ActivityManagerNativite.startService,也就是调用的ActivityManagerService.startService,通过binder方式将要启动的Service信息传给SystemServer进程。
![img_da5d86614f066863d9bd3d663a1b1c89.png](https://i-blog.csdnimg.cn/blog_migrate/0025a5b231016be764b2d12566e68168.png)
AMS的startService函数中会将启动service交给mServices对象,该对象的实现为ActiveService。调用ActiveService.startServiecLocked方法。
![img_49ca2920654ea9b97d82097dd222afaa.png](https://i-blog.csdnimg.cn/blog_migrate/4813f1e5b24158802a6ba00cc721aaa7.png)
ActiveService.startServiecLocked中调用retrieveServiceLocked来查找目标Service的信息,查找时先在本地的ServiceMap查询,查找不到就到PackageManagerService中查询(App安装后所有的组件信息都在PMS中保存了),最终取得ServiceLookupResult。之后会继续调用startServiceInnerLocked:
![img_312b5d787f50b56328288443f4d11115.png](https://i-blog.csdnimg.cn/blog_migrate/29a6983ee895fcaa1682c93a780e55a0.png)
startServiceInnerLocked继续调用bringUpServiceLocked,该方法实现如下:
![img_090229d079266d4e2497e733d9225e73.png](https://i-blog.csdnimg.cn/blog_migrate/1930d66c87784fbef0a3819100dc8208.png)
bringUpServiceLocked首先去获取Service所在的进程信息,然后调用realStartServiceLocked:
![img_756ad7f36a86e0eb1aeabdb9afd6024a.png](https://i-blog.csdnimg.cn/blog_migrate/3687d7048222e4758d07c778c4704f19.png)
realStartServiceLocked会调用目标进程的ApplicationThread.scheduleCreateService函数,最终运行ActivityThread.handleCreateService来创建Service对象。
![img_1d2fa00411e2ad8ef480ebb06aa8269f.png](https://i-blog.csdnimg.cn/blog_migrate/bae66ea73e80071dc66839ab53539c65.png)
ActivityThread.handleCreateService通过反射创建了Service对象,并调用onCreate方法和attach方法。最终调用AMS.serviceDoneExecuting介绍startService的流程。