这篇同样是Android开发者文档的翻译总结:
Android Interface Definition Language:
顾名思义AIDL是一种接口定义语言,它适用于定义不同进程间通信的接口的,因为在Android中进程是无法轻易的访问其他进程的。
note:只有在要处理多线程的并发访问时,才需要使用到AIDL。
Defining an AIDL Interface:
我们需要在src/目录下定义接口在一个.aidl的文件,接口的定义语法和Java接口的定义语法很类似。并且将它保存在服务的宿主应用和所有绑定服务的应用中。我们的开发环境会用AndroidSDK的工具根据定义的.aidl文件生成一个IBinder接口的.java文件,并将它保存在gen/目录下。我们在service中要实现这个接口。
利用AIDL创建绑定服务要经过如下一些步骤:
1,创建一个.aidl文件:
这个文件中定义接口的方法签名;
2,实现这个接口:
在gen/目录下生成的.java文件,有一个继承了Binder类并且实现了AIDL定义的接口的内部类Stub,我们必须继承这个类。
3,将接口暴露给客户端:
在Service中覆盖onBind()方法,并返回这个Stub 的实现类。
要注意的是,如果我们要对之前的接口定义进行修改,一定要保持它的兼容性。
Create the aidl file:
AIDL支持下面的数据类型:
·Java中的所有基本数据类型;
·String;
·CharSequence;
·List:
List中的元素必须是这些支持的数据类型或者是在用AIDL定义过的parcelable。List支持泛型定义(List<String>)。虽然我们使用的是List,但是在另一端接受的类型总是ArrayList。
·Map:
Map中数据元素类型和List的要求是一样的,只是Map是不支持泛型定义的。
我们在使用其他数据类型时需要使用import关键字导入,即便是他们是在同一个包中。
Implement the method:
内部类Stub中定义了一个静态方法:asInterface()。我们需要在serviceConnection的onServiceConnected方法中使用它将传递过来的IBinder对象转换为Stub实现类对象。
注意:
·我们必须要考虑这些实现方法的线程安全问题;
·如果这些方法要做耗时的操作,不应该在activity的主线程中调用。
Expose interface to client:
在客户端binderService建立连接时,通过onserviceConnected()方法传递IBinder对象。