由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间。但是android提供了AIDL可以用来进程间数据传递。
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
下面通过一个实例来演示AIDL,因为是进程之间数据传递,所以这里要使用建立android工程,一个是AIDL的服务端另一个是客户端.
服务端的实现步骤:
1.创建.aidl文件 IMyService.aidl
因为这里用到了Peson对象,所以要创建一个person类。Person类,是一个序列化的类,这里使用Parcelable 接口来序列化,是Android提供的一个比Serializable 效率更高的序列化类。
然后创建Person.aidl文件,注意这里的parcelable小写。
上面的IMyService.aidl保存以后会在gen的相应目录下启动生成如下代码:
Binder
因为sub类实现了Binder接口,所以以后会使用这个类。
2.实现service类
3.客户端实现步骤:
首先建立一个项目,把服务端的
包和类一起拷贝到客户端项目中。因为客户端要和服务端通信,必须要使用同一个aidl。
然后构造客户端的activity类:
最后不要忘记注册service:
启动service的时候使用了隐士意图。
运行服务端工程.
服务端已经启动,然后运行客户端工程:
OK,已经从服务端得到了数据,第一句话就是从服务端得到的,下面看看,传递对象和获取对象与服务端。
点击添加联系人,然后点击获取联系人按钮: