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就是一个类,此类的实现也在同一个包里。
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文件,这个文件比较简单
接口,开头的字母p一个小写一个大写。
这样就实现了在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中使用自定义类作为参数传递的功能。
相关文章推荐
- CSDN博客文章之Java资源
- 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
- JAVA常见问题总结
- Spring各jar包的作用(转载)
- Java设计模式_行为型_观察者模式_任意行为的监听
- Java中判断String不为空的问题
- Java类集学习(五)集合的输出
- java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries
- ubuntu启动eclipse时出错cannot open display
- jsonp和java示例
- 希望能结识更多热爱Java的小伙伴
- Java 1.7 语法新特性
- java集合:线性表
- eclipse重新设置workspace路径
- 关于不再使用的Java对象手工指null是否有意义
- java设计模式----责任链模式
- 可能是东半球最全的RxJava使用场景小结
- spring mvc 用ajaxSubmit 在iE8上传文件变下载的问题
- SpringMVC中使用DWR
- hbase数据迁移put方法java代码