默认情况下,AIDL 支持下列数据类型:
- Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
- String/CharSequence
List
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
Map
Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map< String,Integer> 形式的 Map)。 另一端实际接收的具体类始终是 HashMap,但生成的方法使用的是 Map 接口。
您必须为以上未列出的每个附加类型加入一个 import 语句,即使这些类型是在与您的接口相同的软件包中定义。
通过 IPC 传递对象
有时一些简单的数据无法满足我们的需求,我们需要的一个自定义实体,这时就需要使用Parcelable,要传递的实体类必须支持 Parcelable 接口。
例如我们要实现一个通过aidl来跨进程图书管理的Service。
package com.zhl.androiddevtestdemo.ipc;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Book实体类
*/
public class Book implements Parcelable{
public int bookId;
public String bookName;
public Book(int bookId, String bookName) {
this.bookId = bookId;
this.bookName = bookName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.bookId);
dest.writeString(this.bookName);
}
protected Book(Parcel in) {
this.bookId = in.readInt();
this.bookName = in.readString();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
}
然后新建一个与要使用实体同名的Book.aidl (必须,如果没有实现这一步将会抛出RuntimeException)
package com.zhl.androiddevtestdemo.ipc;
import com.zhl.androiddevtestdemo.ipc.Book;
parcelable Book;
最后写图书管理IBookManager.aidl
package com.zhl.androiddevtestdemo.ipc;
//导入实体类
import com.zhl.androiddevtestdemo.ipc.Book;
interface IBookManager {
List<Book> getBookList();
void addBook(in Book book);
}