当自定义的类对象作为远程调用service的参数时,该类要求实现Parcelable实现序列化。就如果java序列化机制要求实现Serializable接口一样,Android提供的序列化机制需要去实现Parcelable。
场景:传入一个对象Person,返回Person拥有的宠物Pet
定义Person类
1、Person.aidl
parcelable Person;
2、Person.java(这个类必须与Person.aidl在同一个目录下,生成Stub内部类的时候会根据Person.aidl的路径生成包名,所以会提示找不到)
实现Parcelable的方法:describeContents writeToParcel
要求在实现类中定义一个CREATOR,类型为Parcelable.Creator的静态变量
package com.wxj.aidlservice.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable{
private int id;
private String name;
private String psw;
public Person() {
super();
}
public Person(int id, String name, String psw) {
super();
this.id = id;
this.name = name;
this.psw = psw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((psw == null) ? 0 : psw.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (psw == null) {
if (other.psw != null)
return false;
} else if (!psw.equals(other.psw))
return false;
return true;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", psw=" + psw + "]";
}
/**
* Parcelable接口方法
*/
@Override
public int describeContents() {
return 0;
}
/**
* Parcelable接口方法,把该对象所包含的数据写到Parcel
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeString(psw);
}
/**
* 必须实现一个静态的Parcelable.Creator对象
*/
public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person[] newArray(int size) {
return new Person[size];
}
@Override
public Person createFromParcel(Parcel source) {
return new Person(source.readInt(),source.readString(),source.readString());
}
};
}
Pet写法与Person类似,也是遵循上面两步,不在重复写代码。
定义一个通信接口IPet.aidl
<span style="font-size:10px;">package com.wxj.aidlservice.aidl;
<strong>import com.wxj.aidlservice.aidl.Pet;
import com.wxj.aidlservice.aidl.Person;</strong>
interface IPet{</span>
<span style="font-size:10px;"><span style="white-space:pre"> </span>//定义一个Person对象作为传入参数
List<Pet> getPet(in Person owner);
}</span>
其他步骤跟普通的service通信没有区别,定义一个Service子类,实现一个继承了Stub的内部类
调用端需要将Service端的Person/Pet类的Java文件、AIDL文件,IPet接口都拷贝过来