(十八)四大组件的工作过程-Service

Service的工作过程

启动过程:
从ContextWrapper的startService方法来看,看到由ContextImpl的mBase对象的startService方法开始,在startService方法里返回startServiceCommon方法,
在该方法里,通过ActivityManagerNative.getDefault()方法启动service。该startService方法是一个远程方法,在其中会通过ActiveService的对象mService完成后续的启动过程。在startServiceLocked方法的尾部会调用startServiceInnerLocked方法,在该方法内部调用bringUpServiceLocked方法,在该方法内部又调用realStartServiceLocked方法。


在handleCreateService方法里做了如下操作:
  通过类加载器创建Service的实例
  创建Application对象并调用其onCreate方法
  创建contextImple对象,并通过attach方法与Service关联。
  调用onCreate方法并将Service存储到ActivityService的一个列表内。

在ActivityThread中还会调用handleServiceArgs方法来回调Service的onStartCommand方法。

Service的绑定过程
和启动过程一样,绑定过程也是从ContextWrapper开始的,从bindService方法内返回mBase的bindServiceCommand方法,在这个方法里完成下列事情:

  1. 将客户端的ServiceConnection对象转化为ServiceDispatcher.InnerConnection对象,有肯跨进程通信,因此InnerConnection充当Binder角色,ServiceDispatcher起连接InnerConnection和ServiceConnection的作用。这个过程是通过LoadedAPK的getServiceDispatcher方法实现。在这个方法里维护了一个ArrayMap,又来存储ServiceConnection和ServiceDispatcher的映射。当客户端和Service建立连接后,系统会通过InnerConnection调用ServiceConnection的onServiceConnection方法,这个过程有可能是跨进程的,当ServiceDispatcher建立好后,通过getServiceDispatcher方法返回其内保存的InnerConnection对象。

  1.  调用AMS的ActivityManagerNative.getDefault的bindService方法,返回ActiveService的 bindServiceLocked方法-->>bringUpServiceLocked方法-->realStartServiceLocked方法,realStartServiceLocked方法的执行逻辑跟之前的一样。
  2. Service的绑定过程会调用app.Thread的scheduleBindService方法,这个过程实现在ActiveService的requestServiceBindingLocked方法里,在scheduleBindService方法里通过Handler H来中转。
  3. 在H里接收到BING_SERVICE的消息时,会交给ActivityThread的handleBindService方法处理。
  4. 在handleBindSrvice中首先根据token取出Service对象,然后通过onBind方法返回客户端一个Binder对象,接着调用AMS的publishService方法回调客户端里的onServiceConnected方法。
  5. 在publishService方法里又调用ActiveServices的publishServiceLocked方法,里面核心内容:c.conn.connected(r.name,service)方法。c的类型是ConnectedRecord,c.conn的类型是ServiceDispatcher.InnerConnection,service就是返回的binder对象。
  6. InnerConnection的connected方法有调用了ServiceDispatcher的connected方法。在SD的该方法里调用H的post方法,将RunConnection对象抛到主线程中,
  7. Runnection里调用了SD的doConnected方法,由于SD储存了客户端的ServiceConnection对象,因此他可以方便的调用onServiceConnected方法。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值