`

Android知识梳理:进程间通信

 
阅读更多

 1.Binder机制

进程间通信英文缩写为IPC。Linux系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。Java系统中的进程间通信方式有socket, named pipe等。Android采用的是Binder通信。

Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。 Binder通信是通过linux的binder driver来实现的,Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。 Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。关于Binder机制的深入理解以及其具体实现可参考Simon的博客,地址是http://my.unix-center.net/~Simon_fu/,在博客中搜索“binder”关键字即可找到。

2.AIDL

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。http://developer.android.com/guide/developing/tools/aidl.html,这是谷歌SDK文档中关于AIDL的描述。Braincol对其进行了翻译,详见http://www.cnblogs.com/hibraincol/archive/2011/09/06/2169325.html。感谢他的工作!

3.Android的进程间通信的使用

3.1在应用层建立AIDL服务

对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一个ActivityManagerService管理JAVA应用层所有的service创建与连接(connect),disconnect,所有的Activity也是通过这个service来启动,加载的。ActivityManagerService也是加载在Systems Servcie中的。

在应用层建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例的内容。
(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
(3)建立一个服务类(Service的子类)。
(4)实现由aidl文件生成的Java接口。
(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
 

3.2在框架层增加系统服务

系统中有一个进程管理所有的system service,Android不允许用户添加非授权的System service,当然现在源码开放了,我们可以修改一些代码来达到添加底层system Service的目的。可以参照Android代码树中的系统服务源码实现,需要注意的是系统服务的实现方式和应用层AIDL服务的实现方式稍有差别。具体的实现可以参考http://www.android1.net/Topic.aspx?BoardID=21&TopicID=990,这是台湾高焕堂先生发的一个帖子。高先生的Android造诣很高,应该多向他学习。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics