转载自:http://blog.csdn.net/cjjky/article/details/7562652html
=======================================java
在Android中,每一个应用程序都有本身的进程,当须要在不一样的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,所以要传递对象,须要把对象解析成操做系统可以理解的数据格式,以达到跨界对象访问的目的。在Android中,则采用AIDL(Android Interface Definition Language :接口定义语言)方式实现。android
AIDL (Android Interface Definition Language)是一种IDL 语言,用于生成能够在Android设备上两个进程之间进行进程间通讯(IPC)的代码。若是在一个进程中(例如Activity)要调用另外一个进程中(例如Service)对象的操做,就能够使用AIDL生成可序列化的参数。编程
AIDL IPC机制是面向接口的,它是使用代理类在客户端和实现端传递数据。设计模式
使用AIDL实现IPCapp
使用AIDL实现IPC服务的步骤是:编程语言
1. 建立.aidl文件-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。ide
2. 在makefile文件中加入.aidl文件-(Eclipse中的ADT插件提供管理功能)Android包括名为AIDL的编译器,位于tools/文件夹。布局
3. 实现接口-AIDL编译器从AIDL接口文件中利用Java语言建立接口,该接口有一个继承的命名为Stub的内部抽象类(而且实现了一些IPC调用的附加方法),要作的就是建立一个继承于YourInterface.Stub的类而且实如今.aidl文件中声明的方法。this
4. 向客户端公开接口-若是是编写服务,应该继承Service而且重载Service.onBind(Intent) 以返回实现了接口的对象实例
建立.aidl文件
AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值能够是任何类型,甚至是其余AIDL生成的接口。重要的是必须导入全部非内置类型,哪怕是这些类型是在与接口相同的包中。下面是AIDL能支持的数据类型:
1.Java编程语言的主要类型 (int, boolean等) — 不须要 import 语句。
2.如下的类 (不须要import 语句):
String
List -列表中的全部元素必须是在此列出的类型,包括其余AIDL生成的接口和可打包类型。List能够像通常的类(例如List<String>)那样使用,另外一边接收的具体类通常是一个ArrayList,这些方法会使用List接口。
Map - Map中的全部元素必须是在此列出的类型,包括其余AIDL生成的接口和可打包类型。通常的maps(例如Map<String,Integer>)不被支持,另外一边接收的具体类通常是一个HashMap,这些方法会使用Map接口。
CharSequence -该类是被TextView和其余控件对象使用的字符序列。
3.一般引引用方式传递的其余AIDL生成的接口,必需要import 语句声明
4.实现了Parcelable protocol 以及按值传递的自定义类,必需要import 语句声明。
经过对上面的基本了解,下面我就以一个具体的实例来讲明Android中如何经过AIDL机制来实现两个进程中实现通信:(情景假设:例如A应用经过服务Service方式向B应用提供经过书籍编号来查询书籍名称的服务)
A应用程序结构图以下:
经过上面的结构图能够看到,在A应用程序中建立一个 aidl 的接口,而后系统在 gen 目录下自动生成相应的 java 文件。
其中 IBook.aidl 文件的源码:
其中 BookService.java 类中的源码以下:
同时别忘了在 Manifest.xml中配置该服务对象(标红色的部分),建议采用隐式方式激活该服务,适合不一样的进程的意图。
以上咱们已经实现了A应用程序提供服务的功能,下面咱们来实现B应用(或者其它须要用到A应用提供服务的应用程序)
B应用程序结构图以下:
咱们看到B应用程序也要和服务端一样的 .aidl 文件,咱们能够从A应用程序中把该 aidl 文件中拷贝过来就是了,呵。因为B应用中 .aidl 文件和 A应用中的 .aidl 文件源码同样,我在这里就不列出来了。
其中AIDLClientDemoActivity.java源码以下:【注:其中该客户端类要经过 bindService 方式来启动另一个进程的服务,这样才能实现和服务进行交互。若是经过startService方式来启动服务,则不能与服务进行交互】
其中界面布局文件 main.xml 源码:
至此,咱们已经完成了B应用程序的代码实现部分,咱们要先把A应用程序部署到机器上,而后咱们再运行B应用程序。下面咱们经过截图来看下程序运行的结果:
经过上面的截图,咱们输入书籍编号 1,就能够查询出相应的书籍名称,到此,咱们就能够了解了 Android应用中如何经过AIDL机制实现两个进程的通信。
注:本文为 Andy.Chen 原创,欢迎你们转载,转载请你们注明出处,谢谢。