`
jguangyou
  • 浏览: 369035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AIDL传输复杂数据示例

 
阅读更多
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();
	}
}
  •  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");
			
		}
	};

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics