AILD知识点汇总

AIDL支持的基本数据类型、String、CharSequence以及特定类型的List和Map。传输对象需实现Parcelable接口。oneway标记用于异步调用,不等待服务器结果,不支持out和inout参数。in、out、inout分别表示数据流向。Parcelable是高效的序列化接口,需要实现特定方法进行序列化和反序列化。Android12中Parcelable的实现有更严格的要求,如成员变量需为final,构造函数和CREATOR需注解@NonNull。
摘要由CSDN通过智能技术生成
  1. 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;
  1. AIDL的oneway

oneway代表这个Binder接口是异步调用,即client端调用server端的方法,类似通知一下server端,不用等server端的执行结果被阻塞。可以提高client端的执行效率,适用于没有返回值的方法。

oneway可以加在interface关键字前,表示整个interface中的方法都是异步调用;

oneway可以加在单个方法名前,表示该方法是异步调用;

oneway修饰的方法不能有out、inout类型的参数,也不能有返回值。

  1. 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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值