- 自定义一个Person类,并实现Parcelable接口,必须实现这个接口,实现这个接口,必须有一个静态变量CREATOR,具体查看http://developer.android.com/reference/android/os/Parcelable.html
public class Person implements Parcelable {
private Integer id;
private String name;
private String pass;
public Person()
{
}
public Person(Integer id, String name, String pass)
{
super();
this.id = id;
this.name = name;
this.pass = pass;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPass()
{
return pass;
}
public void setPass(String pass)
{
this.pass = pass;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((pass == null) ? 0 : pass.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 (name == null)
{
if (other.name != null)
return false;
}
else if (!name.equals(other.name))
return false;
if (pass == null)
{
if (other.pass != null)
return false;
}
else if (!pass.equals(other.pass))
return false;
return true;
}
// 实现Parcelable接口必须实现的方法
@Override
public int describeContents()
{
return 0;
}
// 实现Parcelable接口必须实现的方法
@Override
public void writeToParcel(Parcel dest, int flags)
{
//把该对象所包含的数据写到Parcel
dest.writeInt(id);
dest.writeString(name);
dest.writeString(pass);
}
// 添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口
public static final Parcelable.Creator<Person> CREATOR
= new Parcelable.Creator<Person>()
{
@Override
public Person createFromParcel(Parcel source)
{
// 从Parcel中读取数据,返回Person对象
return new Person(source.readInt()
, source.readString()
, source.readString());
}
@Override
public Person[] newArray(int size)
{
return new Person[size];
}
};
- 定义一个Pet类,同样实现Parcelable接口
public class Pet implements Parcelable {
private String name;
private double weight;
public Pet() {
}
public Pet(String name, double weight) {
super();
this.name = name;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeDouble(weight);
}
// 添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口
public static final Parcelable.Creator<Pet> CREATOR
= new Parcelable.Creator<Pet>()
{
@Override
public Pet createFromParcel(Parcel source)
{
// 从Parcel中读取数据,返回Person对象
return new Pet(source.readString()
, source.readDouble());
}
@Override
public Pet[] newArray(int size)
{
return new Pet[size];
}
};
@Override
public String toString()
{
return "Pet [name=" + name + ", weight=" + weight + "]";
}
}
- 定义Person.aidl和Pet.aidl
Person.aidl
parcelable Person;
Pet.aidl
parcelable Pet;
说明一下,在API Guides上是这样说的:
如你有一个类,并且想通过IPC interface,把它从一个进程发送到另一个进程,你的类必须实现 Parcelable
接口。支持 Parcelable
接口是非常重要的,因为它允许android系统分解这个对象成为原语( primitives,不知道翻译为原语对不对)。创建一个类来实现 Parcelable接口,必须做如下事情:
- 实现Parcelable接口
- 实现writeToParcel,方法,当前的对象将被写入一个Parcel.中。
- 定一个静态的变量,名字为CREATOR,他是一个实现了Parcelable.Creator 接口的一个对象。
- 最后,你需要创建一个.aidl文件来声明你的parcelable 类。其实就向上面的Person.aidl和Pet的aidl。
- 定义一个IPet.aidl,这个才是会生成java文件的AIDL
import com.example.aidlservice.Person;
import com.example.aidlservice.Pet;
interface IPet {
List<Pet> getPets(in Person owner);
}
注意,即使都在一个包中,也必须import,但是List就不需要Import。
- 定义Service类
public class ComplexAidlService extends Service {
private ComplexBinder petBinder;
private static Map<Person , List<Pet>> pets
= new HashMap<Person , List<Pet>>();
static
{
// 初始化pets Map集合
ArrayList<Pet> list1 = new ArrayList<Pet>();
list1.add(new Pet("旺财" , 4.3));
list1.add(new Pet("来福" , 5.1));
pets.put(new Person(1, "sun" , "sun") , list1);
ArrayList<Pet> list2 = new ArrayList<Pet>();
list2.add(new Pet("kitty" , 2.3));
list2.add(new Pet("garfield" , 3.1));
pets.put(new Person(2, "bai" , "bai") , list2);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return petBinder;
}
class ComplexBinder extends IPet.Stub{
@Override
public List<Pet> getPets(Person owner) throws RemoteException {
return pets.get(owner);
}
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
petBinder = new ComplexBinder();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
- Activity调用
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
System.err.println("service is unconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//System.err.println(ICat==null);
petService = IPet.Stub.asInterface(service) ;
System.err.println("service is connected");
}
};