欢迎光临
我们一直在努力

Android多进程开发 - AIDL 参数方向、AIDL 传递自定义对象、AIDL 传递自定义对象(参数方向)

一、AIDL 参数方向

1、基本介绍
  • 在 AIDL 中,引用类型参数必须明确指定方向
方向说明
in 服务端使用客户端传入的参数(最常用)
out 服务端填充客户端传入的参数
inout 服务端使用客户端传入的参数,并重新填充
2、演示
(1)AIDL

package com.my.common;

interface IMyAidlInterface {
void data_in(in byte[] data);
void data_out(out byte[] data);
void data_inout(inout byte[] data);

void list_in(in List<String> list);
void list_out(out List<String> list);
void list_inout(inout List<String> list);
}

(2)Server

private final IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub() {

@Override
public void data_in(byte[] data) throws RemoteException {
Log.i(TAG, "data_in input: " + Arrays.toString(data));

data[0] = 101;
data[1] = 102;
}

@Override
public void data_out(byte[] data) throws RemoteException {
Log.i(TAG, "data_out input: " + Arrays.toString(data));

data[0] = 101;
data[1] = 102;
}

@Override
public void data_inout(byte[] data) throws RemoteException {
Log.i(TAG, "data_out input: " + Arrays.toString(data));

data[0] = 101;
data[1] = 102;
}

@Override
public void list_in(List<String> list) throws RemoteException {
Log.i(TAG, "list_in input: " + list);

list.add("server item1");
list.add("server item2");
}

@Override
public void list_out(List<String> list) throws RemoteException {
Log.i(TAG, "list_out input: " + list);

list.add("server item1");
list.add("server item2");
}

@Override
public void list_inout(List<String> list) throws RemoteException {
Log.i(TAG, "list_inout input: " + list);

list.add("server item1");
list.add("server item2");
}
};

(3)Client Test
  • data_in 方法
  • byte[] data = new byte[2];
    data[0] = 1;
    data[1] = 2;

    try {
    myAidlInterface.data_in(data);
    Log.i(TAG, "data_in method success");
    Log.i(TAG, "after data: " + Arrays.toString(data));
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "data_in method error: " + e.getMessage());
    }

    # Server

    data_in input: [1, 2]

    # Client

    data_in method success
    after data: [1, 2]

  • data_out 方法
  • byte[] data = new byte[2];
    data[0] = 1;
    data[1] = 2;

    try {
    myAidlInterface.data_out(data);
    Log.i(TAG, "data_out method success");
    Log.i(TAG, "after data: " + Arrays.toString(data));
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "data_out method error: " + e.getMessage());
    }

    data_out input: [0, 0]

    data_out method success
    after data: [101, 102]

  • data_inout 方法
  • byte[] data = new byte[2];
    data[0] = 1;
    data[1] = 2;

    try {
    myAidlInterface.data_inout(data);
    Log.i(TAG, "data_inout method success");
    Log.i(TAG, "after data: " + Arrays.toString(data));
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "data_inout method error: " + e.getMessage());
    }

    data_out input: [1, 2]

    data_inout method success
    after data: [101, 102]

  • list_in 方法
  • try {
    List<String> list = new ArrayList<>();
    list.add("client item1");
    list.add("client item2");
    myAidlInterface.list_in(list);
    Log.i(TAG, "list_in method success");
    Log.i(TAG, "after list: " + list);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "list_in method error: " + e.getMessage());
    }

    # Server

    list_in input: [client item1, client item2]

    # Client

    list_in method success
    after list: [client item1, client item2]

  • list_out 方法
  • try {
    List<String> list = new ArrayList<>();
    list.add("client item1");
    list.add("client item2");
    myAidlInterface.list_out(list);
    Log.i(TAG, "list_out method success");
    Log.i(TAG, "after list: " + list);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "list_out method error: " + e.getMessage());
    }

    # Server

    list_out input: []

    # Client

    list_out method success
    after list: [server item1, server item2]

  • list_inout 方法
  • try {
    List<String> list = new ArrayList<>();
    list.add("client item1");
    list.add("client item2");
    myAidlInterface.list_inout(list);
    Log.i(TAG, "list_inout method success");
    Log.i(TAG, "after list: " + list);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "list_inout method error: " + e.getMessage());
    }

    # Server

    list_inout input: [client item1, client item2]

    # Client

    list_inout method success
    after list: [client item1, client item2, server item1, server item2]


    二、AIDL 传递自定义对象

    1、Custom Object
    • Person,这里是位于 src/main/java/com/my/common 包下

    package com.my.common;

    import android.os.Parcel;
    import android.os.Parcelable;

    import androidx.annotation.NonNull;

    public class Person implements Parcelable {

    public String name;
    public int age;

    public Person(String name, int age) {
    this.name = name;
    this.age = age;
    }

    // 反序列化读取
    protected Person(Parcel in) {
    name = in.readString();
    age = in.readInt();
    }

    // 序列化写入
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeInt(age);
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel in) {
    return new Person(in);
    }

    @Override
    public Person[] newArray(int size) {
    return new Person[size];
    }
    };

    // 一般返回 0
    @Override
    public int describeContents() {
    return 0;
    }

    @Override
    public String toString() {
    return "Person{" +
    "name='" + name + '\\'' +
    ", age=" + age +
    '}';
    }
    }

    2、AIDL
    • Person.aidl,这里是位于 src/main/aidl/com/my/common 包下

    package com.my.common;

    parcelable Person;

    • MyAidlInterface.aidl,这里是位于 src/main/aidl/com/my/common 包下

    package com.my.common;

    import com.my.common.Person;

    interface IMyAidlInterface {
    void setPerson(in Person person);
    }

    3、Server

    private final IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub() {

    @Override
    public void setPerson(Person person) throws RemoteException {
    Log.i(TAG, "setPerson input: " + person);
    }
    };

    4、Client Test

    Person person = new Person("client person", 18);

    try {
    myAidlInterface.setPerson(person);
    Log.i(TAG, "setPerson method success");
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "setPerson method error: " + e.getMessage());
    }

    # Server

    setPerson input: Person{name='client person', age=18}

    # Client

    setPerson method success


    三、AIDL 传递自定义对象(参数方向)

    1、Custom Object
    • Person.java

    public class Person implements Parcelable {

    public String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
    this.name = name;
    this.age = age;
    }

    // 反序列化读取
    protected Person(Parcel in) {
    name = in.readString();
    age = in.readInt();
    }

    // 序列化写入
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeInt(age);
    }

    // 从 Parcel 重新读入(用于 out/inout)
    public void readFromParcel(Parcel in) {
    name = in.readString();
    age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel in) {
    return new Person(in);
    }

    @Override
    public Person[] newArray(int size) {
    return new Person[size];
    }
    };

    // 一般返回 0
    @Override
    public int describeContents() {
    return 0;
    }

    @Override
    public String toString() {
    return "Person{" +
    "name='" + name + '\\'' +
    ", age=" + age +
    '}';
    }
    }

    2、AIDL
    • Person.aidl

    package com.my.common;

    parcelable Person;

    • MyAidlInterface.aidl

    package com.my.common;

    import com.my.common.Person;

    interface IMyAidlInterface {
    void person_in(in Person person);
    void person_out(out Person person);
    void person_inout(inout Person person);
    }

    3、Server

    private final IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub() {

    @Override
    public void person_in(Person person) throws RemoteException {
    Log.i(TAG, "person_in input: " + person);

    person.name = "server person";
    person.age = 20;
    }

    @Override
    public void person_out(Person person) throws RemoteException {
    Log.i(TAG, "person_out input: " + person);

    person.name = "server person";
    person.age = 20;
    }

    @Override
    public void person_inout(Person person) throws RemoteException {
    Log.i(TAG, "person_inout input: " + person);

    person.name = "server person";
    person.age = 20;
    }
    };

    4、Client Test
  • person_in 方法测试
  • try {
    Person person = new Person("client person", 18);
    myAidlInterface.person_in(person);
    Log.i(TAG, "person_in method success");
    Log.i(TAG, "after person: " + person);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "person_in method error: " + e.getMessage());
    }

    # Server

    person_in input: Person{name='client person', age=18}

    # Client

    person_in method success
    after person: Person{name='client person', age=18}

  • person_out 方法测试
  • try {
    Person person = new Person("client person", 18);
    myAidlInterface.person_out(person);
    Log.i(TAG, "person_out method success");
    Log.i(TAG, "after person: " + person);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "person_out method error: " + e.getMessage());
    }

    # Server

    person_out input: Person{name='null', age=0}

    # Client

    person_out method success
    after person: Person{name='server person', age=20}

  • person_inout 方法测试
  • try {
    Person person = new Person("client person", 18);
    myAidlInterface.person_inout(person);
    Log.i(TAG, "person_inout method success");
    Log.i(TAG, "after person: " + person);
    } catch (RemoteException e) {
    e.printStackTrace();
    Log.e(TAG, "person_inout method error: " + e.getMessage());
    }

    # Server

    person_inout input: Person{name='client person', age=18}

    # Client

    person_inout method success
    after person: Person{name='server person', age=20}

    赞(0)
    未经允许不得转载:171主机测评 » Android多进程开发 - AIDL 参数方向、AIDL 传递自定义对象、AIDL 传递自定义对象(参数方向)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址