1.Interface name must be unique
AS中创建AIDL文件的时候会报与.java文件名冲突。解决方法是先创建AIDL文件,后创建JAVA文件。
2.AIDL 支持下列数据类型:
Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
String
CharSequence
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map
void setFruit(in Fruit);
void setFruit(out Fruit);
void setFruit(inout Fruit);
注意:应该将方向限定为真正需要的方向,因为编组参数的开销极大。
非原参对象实现Procelable接口时要需要新建一个实体.aidl
package ***
procelable Fruit;
3.什么情况下使用AIDL
只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。 如果不需要执行跨越不同应用的并发 IPC,就应该通过实现一个 Binder 创建接口;或者,如果想执行 IPC,但根本不需要处理多线程,则使用 Messenger 类来实现接口。
4.java.lang.SecurityException: Binder invocation to an incorrect interface报错问题
是由于服务端工程AIDL包名与服务端工程中AIDL包名不一致引起的问题。
5.报Error:(259, 42) 错误: 找不到符号
是由于将java实体文件放在了AIDL文件夹中导致在AIDL接口方法中找不到类,需要在build.gradle中声明:
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/aidl']
}
}
以上作用是查找java文件的时候也在aidl包下查找。
6. in,out,inout
非原语参数配置in,out,inout
in:数值通过aidl能够传入,并且在service中操作后传回来。
out:数值不能传入,但是能从service中传回来。
inout:数值能够传入传出
demo下载地址:http://download.youkuaiyun.com/download/whatfizzer/10265639
https://developer.android.com/guide/components/aidl.html#CreateAidl