startService的Service启动过程分析

在Activity中调用startService启动某个Service的流程如下所示:

img_1033a0a2c305e1f09a5ca1f96f7cf38b.png
startService的启动流程

在调用Activity.startService的时候实际上市调用的ContextImpl.startService,ContextImpl.startService会地哦啊与startServiceCommon方法,如下所示:

img_387b842811794736be1aa8dfc68d5de1.png
ContextImpl.startServiceCommon

startServiceCommon中会调用ActivityManagerNativite.startService,也就是调用的ActivityManagerService.startService,通过binder方式将要启动的Service信息传给SystemServer进程。

img_da5d86614f066863d9bd3d663a1b1c89.png
ActivityManagerService.startService

AMS的startService函数中会将启动service交给mServices对象,该对象的实现为ActiveService。调用ActiveService.startServiecLocked方法。

img_49ca2920654ea9b97d82097dd222afaa.png
ActiveService.startServiecLocked

ActiveService.startServiecLocked中调用retrieveServiceLocked来查找目标Service的信息,查找时先在本地的ServiceMap查询,查找不到就到PackageManagerService中查询(App安装后所有的组件信息都在PMS中保存了),最终取得ServiceLookupResult。之后会继续调用startServiceInnerLocked:

img_312b5d787f50b56328288443f4d11115.png
ActiveService. startServiceInnerLocked

startServiceInnerLocked继续调用bringUpServiceLocked,该方法实现如下:

img_090229d079266d4e2497e733d9225e73.png
bringUpServiceLocked

bringUpServiceLocked首先去获取Service所在的进程信息,然后调用realStartServiceLocked:

img_756ad7f36a86e0eb1aeabdb9afd6024a.png
realStartServiceLocked

realStartServiceLocked会调用目标进程的ApplicationThread.scheduleCreateService函数,最终运行ActivityThread.handleCreateService来创建Service对象。

img_1d2fa00411e2ad8ef480ebb06aa8269f.png
ActivityThread.handleCreateService

ActivityThread.handleCreateService通过反射创建了Service对象,并调用onCreate方法和attach方法。最终调用AMS.serviceDoneExecuting介绍startService的流程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值