- 自定义一个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"); } };