一、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绑定就完成了。