四大组件Service的工作过程

一、Service的工作状态     

 

1、启动状态

用于执行后台计算
Intent intent = new Intent(this, MyService.class);
startService(intentService);

2、绑定状态

用于其他组件和Service的交互
Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, BIND_AUTO_CREATE);

二、Service的启动过程


1、从ContextWrapper的startService()开始

调用ContextImpl的startService(),startService()内部调用startServiceCommon()开启服务,ContextImpl通过attach方法和Activity建立关联。

2、startServiceCommon()调用ActivityManagerNative.getDefault().startService()

ActivityManagerNative.getDefault()获取的是ActivityManagerService对象,通过ActivityManagerService对象来启动服务是一个远程过程调用,startService()内部调用ActiveServices的startServiceLocked()。

3、startServiceLocked()调用startServiceInnerLocked()

startServiceInnerLocked()并没有完成具体的启动工作,而是把具体工作交给了bringUpServiceLocked(),而bringUpServiceLocked()又调用了realStartServiceLocked()。

4、realStartServiceLocked()调用scheduleCreateService()

首先通过ApplicationThread的scheduleCreateService方法来创建Service对象,并调用其onCreate方法,接着再通过sendServiceArgsLocked方法来调用Service的其他方法,scheduleLaunchActivity()内部使用Handler来处理消息。

5、接收到CREATE_SERVICE消息后,通过ActivityThread的handleCreateService()完成以下工作

  • 1)首先通过类加载器创建Service的实例。
  • 2)然后创建Application对象并调用它的onCreate方法。
  • 3)接着创建ContextImpl对象并通过Service的attach方法建立两者的关联,
  • 4)最后调用Service的onCreate方法,并将Service对象存储到ActivityThread中的一个列表里,Service就启动了。

三、Service的绑定过程


1、从ContextWrapper的bindService()开始,bindService()调用bindServiceCommon方法,完成两个工作

  • 1)将客户端的ServiceConnection对象转化为ServiceDispather.InnerConnection对象,而ServiceDispather起着连接ServiceConnection和InnerConnection的作用。
  • 2)内部的bindService()通过ActivityManagerService来完成具体的绑定过程。

2、bindService()调用bindServiceLocked()

bindServiceLocked()->bringUpServiceLocked()->realStartServiceLocked()

3、requestServiceBindingLocked()调用ApplicationThread的scheduleBindService()方法

scheduleBindService()内部使用Handler来处理消息。

4、当接收到BIND_SERVICE消息时,调用ActivityThread的handleBindService()

首先根据Service的token取出Service对象,然后调用Service的onBind方法,Service的onBind方法返回一个Binder给客户端使用,但是onBind方法是Service的,所以还必须调用客户端的ServiceConnection中的onServiceConnected,通过ActivityManagerNative.getDefault()的publishService方法来完成,最后Service绑定就完成了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值