AIDL中使用java类

    AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。
    其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。
    而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import.
    需要特别注意的是,对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
    AIDL只支持接口方法,不能公开static变量。
    如果在aidl中使用某各类的对象,需要将此类的实现也放在aidl所在的package里,例如AidlPboc.aidl中的processPBOC接口,
参数EmvTransData就是一个类,此类的实现也在同一个包里。
interface AidlPboc{
	void checkCard(boolean supportMag,boolean supportIC ,boolean supportRF,int timeout,AidlCheckCardListener listener);
	void cancelCheckCard();
	void processPBOC(in EmvTransData transData, AidlPbocStartListener listener);
	void endPBOC();
	void abortPBOC();
	boolean  clearKernelICTransLog();
	int readKernelData(in String[] taglist,out byte[] buffer);
	void setTlv(String tag, in byte[] value);
	String parseTLV (String tag,String tlvlist);
	boolean importAmount(String amt);
	boolean importAidSelectRes(int index);
	boolean importPin(String pin);
	boolean importUserAuthRes(boolean res);
	boolean importMsgConfirmRes(boolean confirm);
	boolean importECashTipConfirmRes(boolean confirm);
	boolean importOnlineResp(boolean onlineRes,
	String respCode,String icc55);
	boolean updateAID(int optflag,String aid); 
	boolean updateCAPK(int optflag,String capk);
	boolean importConfirmCardInfoRes(boolean res);
}
EmvTransData.java文件内容如下
public class EmvTransData implements Parcelable {
	private byte transtype;
	private byte requestAmtPosition;
	private boolean isEcashEnable;
	private boolean isSmEnable;
	private boolean isForceOnline;
	private byte emvFlow;
	private byte slotType;
	private byte[] reserv;

	public EmvTransData(Parcel source) {
		this.transtype = source.readByte();
		this.requestAmtPosition = source.readByte();
		this.isEcashEnable = (Boolean) source.readValue(Boolean.class
				.getClassLoader());
		this.isSmEnable = (Boolean) source.readValue(Boolean.class
				.getClassLoader());
		this.isForceOnline = (Boolean) source.readValue(Boolean.class
				.getClassLoader());
		this.emvFlow = source.readByte();
		this.slotType = source.readByte();
		this.reserv = (byte[]) source.readValue(byte[].class.getClassLoader());
	}
	
	
	
	public EmvTransData(byte transtype, byte requestAmtPosition,
			boolean isEcashEnable, boolean isSmEnable, boolean isForceOnline,
			byte emvFlow, byte slotType, byte[] reserv) {
		super();
		this.transtype = transtype;
		this.requestAmtPosition = requestAmtPosition;
		this.isEcashEnable = isEcashEnable;
		this.isSmEnable = isSmEnable;
		this.isForceOnline = isForceOnline;
		this.emvFlow = emvFlow;
		this.slotType = slotType;
		this.reserv = reserv;
	}



	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeByte(this.transtype);
		dest.writeByte(this.requestAmtPosition);
		dest.writeValue(isEcashEnable);
		dest.writeValue(isSmEnable);
		dest.writeValue(isForceOnline);
		dest.writeByte(emvFlow);
		dest.writeByte(slotType);
		dest.writeValue(reserv);

	}

	public static final Parcelable.Creator<EmvTransData> CREATOR = new Creator<EmvTransData>() {

		@Override
		public EmvTransData createFromParcel(Parcel source) {
			// TODO Auto-generated method stub
			EmvTransData emvTransData = new EmvTransData(source);
			return emvTransData;
		}

		@Override
		public EmvTransData[] newArray(int size) {
			// TODO Auto-generated method stub
			return null;
		}
	};

	public byte getTranstype() {
		return transtype;
	}

	public void setTranstype(byte transtype) {
		this.transtype = transtype;
	}

	public byte getRequestAmtPosition() {
		return requestAmtPosition;
	}

	public void setRequestAmtPosition(byte requestAmtPosition) {
		this.requestAmtPosition = requestAmtPosition;
	}

	public boolean isEcashEnable() {
		return isEcashEnable;
	}

	public void setEcashEnable(boolean isEcashEnable) {
		this.isEcashEnable = isEcashEnable;
	}

	public boolean isSmEnable() {
		return isSmEnable;
	}

	public void setSmEnable(boolean isSmEnable) {
		this.isSmEnable = isSmEnable;
	}

	public boolean isForceOnline() {
		return isForceOnline;
	}

	public void setForceOnline(boolean isForceOnline) {
		this.isForceOnline = isForceOnline;
	}

	public byte getEmvFlow() {
		return emvFlow;
	}

	public void setEmvFlow(byte emvFlow) {
		this.emvFlow = emvFlow;
	}

	public byte getSlotType() {
		return slotType;
	}

	public void setSlotType(byte slotType) {
		this.slotType = slotType;
	}

	public byte[] getReserv() {
		return reserv;
	}

	public void setReserv(byte[] reserv) {
		this.reserv = reserv;
	}

	public static Parcelable.Creator<EmvTransData> getCreator() {
		return CREATOR;
	}
}
由代码看,此类继承了Parcelable,是一个序列化的类,这里使用Parcelable 接口来序列化,是Android提供的一个比Serializable 效率更高的序列化类。
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
除了Serializable 之外,使用Parcelable 也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。
Parcelable需要实现三个函数:
    1) void writeToParcel(Parcel dest, int flags) 将需要序列化存储的数据写入外部提供的Parcel对象dest。而看了网上的代码例子,个人猜测,读取Parcel数据的次序要和这里的write次序一致,否则可能会读错数据。具体情况我没试验过!
    2) describeContents() 没搞懂有什么用,反正直接返回0也可以
    3) static final Parcelable.Creator对象CREATOR  这个CREATOR命名是固定的,而它对应的接口有两个方法:
    createFromParcel(Parcel source) 实现从source创建出实例的功能
    newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。
接下来要创建EmvTransData.aidl文件,这个文件比较简单
package com.lkl.cloudpos.aidl.emv;
parcelable EmvTransData;
注意这里的parcelable和原来实现的Parcelable 接口,开头的字母p一个小写一个大写。
这样就实现了在aidl中使用自定义类作为参数传递的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值