Android Service的启动过程

在讲service启动之前先讲两个概念:

1、context、contextWrapper、contextImpl的关系

图片

ContextWrapper、ContextImpl都是继承自Context,像我们调用startService()就是调用ContextWrapper里面mBase.startService()  mBase是ContextWrapper的实例,所以startService()的真正实现是在ContextWrapper里面的

2、ActivityManagerNative、ActivityManagerProxy、ActivityManagerService的关系

其实这是一个aidl,ActivityManagerNative、ActivityManagerProxy的实现是跟我们写***.aidl文件之后系统自动生成的一样,我们普通调用ActivityManagerNative.getDefault.startService(),其实具体实现就是在ActivityManagerService().startService()


Service的启动有两种方式:StartService()和BindService()两种

1、startService()的启动方式:

(ContextWrapper)startService()->(ContextImpl)StartService()->startServiceCommon()  接下来就是进入到ActivityManagerService里面了

service


特别提一下在(ActiveService)bringUpServiceLocked()里面会判断这个Service是否已经启动了 如果启动了就调用startServiceCommon()->... onStartCommand() 如果没有启动就调用HandleCreateService()->...onCreate()

至此:startService()就启动了


2、bindService()的启动过程:

(ContextWrapper)bindService()->(ContextImpl)bindService()->bindServiceCommon()接下来就到ActivityManagerService里面了


先判断service是否已经启动了。启动了则不回调onCreate(),启动成功之后再回调connectSuccess,之后再回调onbind()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值