四大组件Service的工作过程

来源:互联网 发布:优化glsl着色器 编辑:程序博客网 时间:2024/06/05 22:49

一、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
原创粉丝点击