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

一、AIDL 参数方向

1、基本介绍
  • 在 AIDL 中,引用类型参数必须明确指定方向
方向 说明
in 服务端使用客户端传入的参数(最常用)
out 服务端填充客户端传入的参数
inout 服务端使用客户端传入的参数,并重新填充
2、演示
(1)AIDL
java 复制代码
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
java 复制代码
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
  1. data_in 方法
java 复制代码
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]
  1. data_out 方法
java 复制代码
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]
  1. data_inout 方法
java 复制代码
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]
  1. list_in 方法
java 复制代码
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]
  1. list_out 方法
java 复制代码
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]
  1. list_inout 方法
java 复制代码
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 包下
java 复制代码
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 包下
java 复制代码
package com.my.common;

parcelable Person;
  • MyAidlInterface.aidl,这里是位于 src/main/aidl/com/my/common 包下
java 复制代码
package com.my.common;

import com.my.common.Person;

interface IMyAidlInterface {
    void setPerson(in Person person);
}
3、Server
java 复制代码
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
java 复制代码
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
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
java 复制代码
package com.my.common;

parcelable Person;
  • MyAidlInterface.aidl
java 复制代码
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
java 复制代码
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
  1. person_in 方法测试
java 复制代码
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}
  1. person_out 方法测试
java 复制代码
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}
  1. person_inout 方法测试
java 复制代码
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}
相关推荐
龚礼鹏3 小时前
android 13 Launcher中应用列表数量,大小如何控制的?
android
SunnyDays10113 小时前
Java 删除与重置 Excel 文件密码(文件级与工作表级完整示例)
java·删除excel文件密码·重置excel文件密码·解除excel工作表保护
Dcs3 小时前
删掉 40 行代码,性能飙 400 倍?OpenJDK 这次把“慢如 /proc”按在地上摩擦!
java
决胜万里3 小时前
zephyr上实现Android Fence机制
android·嵌入式
t***442311 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
java
daidaidaiyu11 小时前
SpringCloud 微服务实现一则 (Eureka + Hystrix)
java·spring
小哥不太逍遥11 小时前
Technical Report 2024
java·服务器·前端
程序员陆业聪12 小时前
2025 年客户端技术盘点与 2026 年技术展望
android
edisao12 小时前
序幕-内部审计备忘录
java·jvm·算法