- AIDL 支持的数据格式
- 八种基本数据类型:byte、char、short、int、long、float、double、boolean
- String,CharSequence 实现了Parcelable接口的数据类型 List
类型。 - List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
- Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
- AIDL参数TAG 有 in、out、inout 三种,基本类型默认为in,自定义类型需显示声明
- 当out时,需要空参数构造方法
- 当 out或inout 时,自定义类型需手动实现
public void readFromParcel(Parcel desc) { name = desc.readString(); }
实操部分
这里顺便试验一下自定义类型,所以要创建一个类,并且实现Parcelable接口.
package com.jyt.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class User implements Parcelable {
String name;
public User() {
}
public User(String name) {
this.name = name;
}
protected User(Parcel in) {
name = in.readString();
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
}
然后可以创建AIDL文件了
右键项目直接创建AIDL文件,路径都帮你生成好了,声明对象的类名可以随意打,因为后面要删掉.
创建2跟AIDL文件,一个是声明类型,一个是声明方法
先看声明类型的
只需要把User对象的package 复制过来 , 加上
parcelable User;即可
再看声明方法的AIDL文件
由于用到了自定义类型,需要import一下,并且主动声明TAG,这里声明in 就不需要实现上面所说的readFromParcel
创建好AIDL文件,make project
这里可以看到生成好的接口
反正是个DEMO,为了方便,两个应用用module区分,包名不一样
app1跟app2都应用共用都aidl文件
implementation project(path: ':aidl')
我这里app1是客户端,app2是服务端
先看服务端
定义一个service,这里引用了自动生成的UserManager.stub,实现一下接口方法
别忘了在xml添加service
服务端就这样了
接下来就是客户端,去使用这个service
刚刚生成的UserManager,就这样初始化了
直接调用方法即可
demo地址
https://github.com/helloV7/AIDLDemo.git