AIDL(Android Interface Definition Language)是 Android 提供的 IPC(进程间通信)机制,用于不同进程间传递复杂数据,其核心是通过生成的 Binder 接口实现数据序列化与反序列化。
以下是通过 AIDL 发送数据的完整流程:
步骤 | 操作说明 | 代码示例 |
---|---|---|
定义 AIDL 文件 | 在 src/main/aidl 目录下创建 .aidl 文件,定义接口及数据结构 |
aidl // IUserService.aidl package com.example.aidl; interface IUserService { void sendUser(in User user); } parcelable User; |
定义数据类 | 数据类需实现 Parcelable 接口 |
java // User.java public class User implements Parcelable { private int id; private String name; // 构造方法、Getter/Setter 省略 // Parcelable 实现 protected User(Parcel in) { id = in.readInt(); name = in.readString(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source); } @Override public User[] newArray(int size) { return new User[size]; } }; } |
实现 AIDL 接口 | 服务端实现接口并处理数据 | java // IUserServiceImpl.java public class IUserServiceImpl extends IUserService.Stub { @Override public void sendUser(User user) { // 处理接收到的 User 对象 Log.d("AIDL", "Received user: " + user.getName()); } } |
客户端调用 | 客户端通过 Binder 代理发送数据 | java // ClientActivity.java IUserService service = IUserServiceImpl.getDefaultImpl(); // 绑定服务后获取 ServiceConnection 中初始化 User user = new User(1, "张三"); service.sendUser(user); |
问题 | 解决方案 |
---|---|
数据类型限制 | AIDL 仅支持基本数据类型、String、Parcelable、List/Map(元素需 Parcelable) |
Parcelable 必须实现 | 自定义数据类需正确实现 Parcelable 接口,否则会抛出异常 |
同步调用阻塞 | AIDL 默认是同步调用,耗时操作需在服务端开线程处理 |
导包错误 | AIDL 文件需与实现类同包名,否则会报 ClassNotFoundException |
Handler
和 Message
,仅支持简单数据(如 Bundle
),实现更简单但灵活性低。byte[]
)后传输。SharedMemory
(如 ParcelFileDescriptor
)共享内存,避免数据拷贝。