前言:回顾一下上一篇博文,上一篇说到,Binder是Android系统中IPC机制的底层依赖,描绘了Binder这种通信架构的基本原理图,并且谈到了使用Binder时需要解决的两个问题。即:1.客户端如何获取Binder对象的引用。2.如何协商服务端的函数标识和参数放入包裹的顺序问题。以便于客户端调用服务时,服务端能识别并提供正确的服务。通过上一篇的介绍,相信大家已经知道了客户端通过Service来获取Binder引用的方式,并且也了解了通过重写服务端Binder的onTransact()方法和客户端Binder的transact()方法来解决上述的第二个问题。对于有经验的程序员,完全可以通过这两种做法来实现IPC通信。于此同时,Google的大神们也为开发者提供了更为方便的AIDL工具,这个工具可以帮我们解决第二个问题,这样,开发者就可以完全专注于业务本身。俗话说:“不做重复的轮子”,既然有这种工具,何乐而不用呢?接下来让我们来走进AIDL。之所以将AIDL放在Binder这里讲,是因为这里着重分析AIDL如何解决Binder通信中的第二个问题。若是这里感觉有点迷糊的话,可以看看上一篇博文《Android中的Binder(一)》
一、什么是AIDL?
AIDL,全称为Android Interface Definition Language,即android接口定义语言。顾名思义,AIDL只是一种定义语言,用它的规范定义的接口,可以被aidl工具识别并生成对应的类。(aidl工具在sdk中,可以自行查看)。相信这样比较抽象,接下来我们通过一个小小的例子来看看aidl如何工作。
二、一个简单的AIDL通信示例
服务端代码,注意与上一篇中的服务端代码进行比较,区别已经在注释中体现出来了。
public class ServerService extends Service {
/**
* 创建服务端binder对象(不用aidl时需要自定义Binder子类,并在Service中返回)
* 并且我们不用在服务端自行书写onTransact()方法
*/
private Binder serverBinder = new IMyServerService.Stub() {
@Override
public void service2(String args) throws RemoteException {
System.out.println("---service2---:" + args);
}
@Override
public void service1() throws RemoteException {
System.out.println("---service1---");
}
};
@Override
public void onCreate() {
Log.i("DEBUG", "---onCreate()---");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
Log.i("DEBUG", "---onBind()---");
return serverBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("DEBUG", "---onUnbind()---");
return super.onUnbind(intent);
}
}
aidl接口定义,新建com.example.aidl包,新建IMyServerService接口ÿ