您的位置:首页 > 移动开发 > Android开发

Android AIDL使用parcelable复杂数据类型方法

2017-04-05 10:15 405 查看

默认情况下,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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android aidl
相关文章推荐