Android之复杂数据的AIDL Service

当自定义的类对象作为远程调用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接口都拷贝过来





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值