您的位置:首页 > 编程语言 > Java开发

AIDL中使用java类

2015-12-30 16:55 176 查看
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中使用自定义类作为参数传递的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: