内容摘自罗升阳的Android系统源代码情景分析。
Service组件是Android应用程序的四大组件之一,它与Activity组件不一样,它主要用来处理与用户界面无关的业务逻辑。Service组件不直接与用户交互,因此,它涉及的业务逻辑一般是计算型的,适合在后台运行。
Service组件的启动方式也分为显式和隐式。对于隐式启动的Service组件来说,我们只需要知道它的组件名称,而对于显式启动的Service组件来说,我们需要知道它的类名称。
Service组件可以被Activity组件启动,也可以被其他的Service组件启动。当一个Service组件被一个Activity组件或另外一个Service组件启动时,我们可以将它们绑定起来,以便启动者可以方便地得到它的访问接口。
Service组件在新进程中的启动过程:
以应用程序Ashmem的Service组件启动过程为例说明:
应用程序Ashmem的Service组件是由Client组件启动的。与Activity组件一样,Service组件也是通过Activity管理服务ActivityManagerService启动的。因此,在Server组件的启动过程中,也会涉及Binder进程间通信机制。由于Service组件的android:process属性被设置为“shy.luo.ashmem.server”,因此它将会在一个名称为"shy.luo.ashmem.server"的应用程序进程中启动。
Client组件启动Service组件的过程如下:
(1)Client组件向ActivityManagerService发送一个启动Service组件的进程间通信请求。
(2)ActivityManagerService发现用来运行Service组件的应用程序进程不存在,因此,他就会首先将Service组件的信息保存下来,接着再创建一个新的应用程序进程。
(3)新的应用程序进程启动完成之后,就会向ActivityManagerService发送一个启动完成的进程间通信请求,以便ActivityManagerService可以继续执行启动Service的操作。
(4)ActivityManagerService将第二步保存下来Service组件信息发送给第二步创建的应用程序进程,以便它可以将Service组件启动起来。
Service组件在进程内的绑定过程:
以应用程序Counter的CounterService组件的绑定过程为例说明:
在应用程序Counter中,CounterService组件是被Counter组件绑定起来的。Counter组件在绑定CounterService组件之前,首先会将它启动起来。CounterService组件的启动就类似上面的启动过程,只是CounterService组件是在已有的应用程序进程中启动的。
Counter组件绑定CounterService组件的过程如下:
(1)Counter组件向ActivityManagerService发送一个绑定CounterService组件的进程间通信请求。
(2)ActivityManagerService发现用来运行CounterService组件的应用程序进程即为Counter组件运行所在的应用程序进程,因此,它就直接通知该进程将CounterService组件启动起来。
(3)CounterService组件启动起来之后,ActivityManagerService就请求它返回一个Binder本地对象,以便Counter组件可以通过这个Binder本地对象昂来和CounterService组件建立连接。
(4)ActivityManagerService将前面从CounterService组件中获得的一个Binder本地对象发送给Counter组件。
(5)Counter组件获得了ActivityManagerService给它发送的Binder本地对象之后,就可以通过这个访问接口来使用CounterService组件所提供的服务,这就相当于将CounterService组件绑定在Counter组件内部了。