AIDL支持的数据类型:
基本数据类型;String和CharSequence;List只支持ArrayList;Map只支持HashMap;Parceable:传输的对象比较实现Parcelable。
如果需要传输对象的话,该对象必须实现Parcelable,且要有对象的AIDL文件。AIDL的DeiveEntity必须和Java的DeiveEntity的package必须相同。
Eg: // DeiveEntity.aidl
package android.app.devicemanager;
import android.app.DeiveEntity;
AIDL的oneway
oneway代表这个Binder接口是异步调用,即client端调用server端的方法,类似通知一下server端,不用等server端的执行结果被阻塞。可以提高client端的执行效率,适用于没有返回值的方法。
oneway可以加在interface关键字前,表示整个interface中的方法都是异步调用;
oneway可以加在单个方法名前,表示该方法是异步调用;
oneway修饰的方法不能有out、inout类型的参数,也不能有返回值。
AIDL的in/out/inout
in:数据只能由client端流向server端,server端可以收到该对象的全部数据,但是会重新new一个新的对象将数据填充进去,所以server端对数据修改不会影响到client端的对象。
可以参考aidl自动生成的Java文件,在stub的onTransact()方法中,in类型的参数都是重新创建一个对象,然后赋值,无论是基本数据类型还是对象。
//onway void onListChanged(in List<DeiveEntity> list)
case TRANSACTION_onListChanged:
{
data.enforceInterface(descriptor);
java.util.List<android.app.devicemanager.DeiveEntity> _arg0;
_arg0 = data.createTypedArrayList(android.app.controllermanager.DeiveEntity.CREATOR);
this.onListChanged(_arg0);
return true;
}
out:数据只能有server端流向client端,在server端修改对象后,client会收到改变后的数据结果。Oneway的方法不能有out类型的参数。
//void onNewDevice(DeviceEntity de)
case TRANSACTION_onNewDevice:
{
data.enforceInterface(descriptor);
android.app.devicemanager.DeiveEntity _arg0;
if ((0!=data.readInt())) {
_arg0 = android.app.devicemanager.DeiveEntity.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
this.onNewDevice1(_arg0);
return true;
}
inout:表示数据可以在服务端与客户端之间双向流通。
4. Parcelable接口
4.1 Parcelable概述
Parcelable是Android的序列化接口,效率更高。
使用方式:类实现Parcelable接口,并override describeContent()、writeToParcel()和反序列化Creator。
describeContent():内容描述,一般返回0,仅当对象中存在描述文件时才返回1。
writeToParcel():序列化功能,通过Parcel中的write方法完成序列化。
Create:反序列化功能,内部表明如何创建序列化对象和数组,通过Parcel的read方法完成反序列化。
4.2 Android 12的Parcelable实现要求
步骤一:创建类implements Parcelable,该类必须是final类型。
步骤二:成员遍历必须是final类型,因此要么初始化时赋初值,要么在构造函数中赋值。
步骤三:参数是Parcel in的构造函数必须加非空注解@NonNull。
步骤四:CREATOR也必须加非空注解@NonNull。
步骤五:writeToParcel()的参数Parcel out也必须加非空注解@NonNull。
步骤六:如果成员变量是private类型,则需要建立一些列get成员遍历的方法。
步骤七:由于成员变量是final类型,如果有需要在其他地方创建该对象并给成员变量赋值,则需要创建内部类Builder。在Builder类中创建自己的非final的成员变量,然后用Builder的成员变量给外部类的成员变量赋值。
步骤八:如果使用Builder来创建对象的时候,则需要给外部类创建一个新的构造函数,参数为Builder对象。
4.2.1 没有Builder的Parcelable类
public final class DeviceEntity implements Parcelable {
public final int id;
public final String name;
public final int state;
//成员变量是final类型,就不能有空参的构造函数
protected DeviceEntity(@NonNull Parcel in) {
id = in.readInt();
name = in.readString();
state = in.readInt();
}
public static final @NonNull Creator<android.app.devicemanager.DeviceEntity> CREATOR = new Creator<android.app.devicemanager.DeviceEntity>() {
@Override
public android.app.devicemanager.DeviceEntity createFromParcel(Parcel in) {
return new android.app.devicemanager.DeviceEntity(in);
}
@Override
public android.app.devicemanager.DeviceEntity[] newArray(int size) {
return new android.app.devicemanager.DeviceEntity[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeInt(id);
out.writeString(name);
out.writeInt(state);
}
4.2.2 有Builder的Parcelable类
public final class DeviceEntity implements Parcelable {
private final int id;
private final String name;
private final int state;
//成员变量是final类型,就不能有空参的构造函数
protected DeviceEntity(@NonNull Parcel in) {
id = in.readInt();
name = in.readString();
state = in.readInt();
}
protected DeviceEntity(@NonNull Builder in) {
id = in.mId;
name = in.mName;
state = in.mState;
}
public static final @NonNull Creator<android.app.devicemanager.DeviceEntity> CREATOR = new Creator<android.app.devicemanager.DeviceEntity>() {
@Override
public android.app.devicemanager.DeviceEntity createFromParcel(Parcel in) {
return new android.app.devicemanager.DeviceEntity(in);
}
@Override
public android.app.devicemanager.DeviceEntity[] newArray(int size) {
return new android.app.devicemanager.DeviceEntity[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeInt(id);
out.writeString(name);
out.writeInt(state);
}
public int getId() {
return id;
}
public int getName() {
return name;
}
public int getState() {
return state;
}
public static final class Builder {
public int mId;
public String mName;
public String mState;
public Builder(@NonNull int id, @NonNull String name) {
this.mId = id;
this.mName = name;
}
}
}