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}
相关推荐
码农周12 小时前
告别大体积PDF!基于PDFBox的Java压缩工具
java·spring boot
码点12 小时前
Android 设备重启如何拿日志
android
devilnumber13 小时前
java中Redisson ,jedis,Lettuce和Spring Data Redis的四种深度对比和优缺点详解
java·redis·spring
摇滚侠13 小时前
Java 进阶教程,全面剖析 Java 多线程编程
java·开发语言
yaaakaaang13 小时前
十四、命令模式
java·命令模式
KevinCyao13 小时前
php彩信接口代码示例:PHP使用cURL调用彩信网关发送图文消息
android·开发语言·php
小锋java123413 小时前
【技术专题】Matplotlib3 Python 数据可视化 - Matplotlib3 绘制饼状图(Pie)
java
wuminyu13 小时前
专家视角看JVM_StartThread
java·linux·c语言·jvm·c++
快点好好学习吧13 小时前
CPU 从 L1/L2 缓存读取 MySQL 代码指令的庖丁解牛
android·mysql·缓存
y小花13 小时前
安卓音频接口从APP到Hal的调用流程
android·音视频