android aidl实现跨进程通信
示例地址:点击打开链接,导入后分别运行aidlserver module和app module
版本:as version:3.0.1 ;gradle version:4.1;gradle plugin version:3.0.1
AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,除了这些类型之外的数据类型,在使用之前必须导包,就算目标文件与当前正在编写的 .aidl 文件在同一个包下。
默认支持的数据类型包括: Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char;String 类型;CharSequence类型;List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(传递对象时,类要实现pacelable接口,as提供插件可快速生成)。List可以使用泛型;Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map不支持泛型。
Gradle 在构建项目的时候通过 sourceSets 来配置不同文件的访问路径,Gradle 默认是将 java 代码的访问路径设置在 java 包下的,如果 java 文件是放在 aidl 包下的话是找不到这个 java 文件的。
修改 module的build.gradle 文件:在 android{} 中加上下面的内容:
sourceSets {
main {
java.srcDirs = [“src/main/java”, “src/main/aidl”]
}
}
如此做,我们可以把java文件和aidl文件放到同一包下。
创建的aidl文件默认在aidl文件夹下,自动创建包。
服务端创建的文件
创建的Book类还要创建与之对应的aidl类Book.aidl,做如下声明:
这样才可以在IBookManager.aidl中调用
将aidl文件夹复制到客户端,复制后如图:
包名要与服务端一致,创建好aidl文件后要rebuild重新编译一下,可自动生成对应的java文件,如图:
在客户端调用服务端时要显示声明:声明包名和Service的路径,5.0之后不支持隐式声明。