您的位置:首页 > 移动开发 > Android开发

Service 组件在新进程中的启动及在进程内的绑定过程

2016-01-31 23:03 337 查看
    内容摘自罗升阳的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组件内部了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android