记得很久之前写过一篇AIDL使用(一),这次写AIDL使用的另外一种情况。我们先看看系统帮我们创建的aidl文件的默认情况是怎样的。
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
这里面有int,long,boolean,float,double,String类型,但是如果我们希望传进来的类型是一个对象,那该怎么办?所以我们这里就要引入序列化的概念。
对象序列化其实就是把一个对象变成一个二进制数据流的方法,方便跨进程传输。通常有两种方法,实现Serializable接口或者Parcelable接口。Serializable这个接口是Java提供的接口,它的实现步骤比较简单,但是开销就比较大,序列化和反序列化都需要大量的I/O操作。而Parcelable接口是Android中序列化的方式,使用起来虽然有点麻烦,但是效率比较高,Android也是推荐这种方法,下面我们就来看看如何用Parcelable实现数据的跨进程传输。
- 首先定义一个Person类,实现Parcelable接口
public class Person implements Parcelable {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
//setter()和getter()方法
protected Person(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];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public String toString() {
return "name:" + name + "、age:" + age;
}
}
其中writeToParcel()这个方法就是打碎片的工作,执行序列化的工作。而CREATOR 就是做反序列化的工作,并且通过createFromParcel()读取,读取的时候要注意,读取的顺序跟序列化的顺序要保持一致,否则会出错。
- 创建Person.aidl文件
parcelable Person;
- 在定义方法的aidl文件里面导包
//必须导入Person所在的包
import com.example.xing.aidldemo.Person;
interface IMyAIDL {
List<Person> add(in Person person);
}
- 在服务器端实现这个方法,通过onBind()返回
@Override
public IBinder onBind(Intent intent) {
persons = new ArrayList<>();
return iBinder;
}
private IBinder iBinder = new IMyAIDL.Stub() {
@Override
public List<Person> add(Person person) throws RemoteException {
persons.add(person);
return persons;
}
};
- 在服务器端这边将Person的java代码和aidl复制到客户端
注意:包名要也要保持一致,而且Person类的包必须是java的下一级
我们现在在客户端的按钮点击一次,就添加一个Person,再输出看看什么情况。
@Override
public void onClick(View view) {
try {
ArrayList<Person> persons = (ArrayList<Person>) iMyAidl.add(new Person("AAA",12));
Log.i("Persons",persons.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
点击了三次之后,确实多了三个Person,证明这个是成功的。
下一次将会解析一下Binder的使用以及上层的原理。