郴州市兴旺宝明通网络有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00144-186681728
邮箱:service@tjzhuojun.com

当前位置:首页 >> 产品展示 >> 默认分类 >> 正文

AIDL传输复杂数据示例

详细信息:

  • 自定义一个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接口,必须做如下事情:

  1. 实现Parcelable接口
  2. 实现writeToParcel,方法,当前的对象将被写入一个Parcel.中。
  3. 定一个静态的变量,名字为CREATOR,他是一个实现了Parcelable.Creator 接口的一个对象。
  4. 最后,你需要创建一个.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();
 }
}