1.在工程下创建aidl为后缀的文件,格式为
package com.demo.aidl;//包名
import com.demo.aidl.XXVo;//引用了对象的aidl 文件路径.类名 com/demo/aidl/XXVo.aidl
//如果有JavaBean 那么在远程调用服务的代码中也要有相应的javaBean
interface AIDLService{
byte[] getToken(String name);
}
2.JavaBean的aidl文件的写法
让JavaBean实现Parcelable 如:public class XXVo implements Parcelable
XXVo.aidl里面的内容只需要一句话:parcelable XXVo;
在别处用到了这个aidl文件的时候 注意导包名
3.创建一个服务class AIDLService extends Service通过绑定启动
public IBinder onBind(Intent intent) {
return new AIDLServiceImpl();
}
在服务里创建final类 实现ISMWService.Stub接口
class AIDLServiceImpl extends AIDLService.Stub{
//实现这些方法
}
//在androidmainfest.xml文件里面注册服务的时候注意有没有android:process=":remote"的区别
<!-- android:process=":remote" -->
<service android:name=".aidl.AIDLService"
android:process=":remote" >
<intent-filter>
<action android:name="com.demo.aidl.AIDLService"/>//通过这个action启动服务
</intent-filter>
</service>
4.调用远程的服务
把相应包名的下文件 aidl文件以及相应的实现了Parcelable的javaBean文件一起拷贝到工程下
com.demo.aidl
-XXVo.java
-XXVo.aidl
-AIDLService.adil
通过bindService的时候启动服务
Intent intent=new Intent();
intent.setAction("com.demo.aidl.AIDLService");//注意查看提供启动的action
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
private ServiceConnection mConnection =new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//处理当取消连接的时候代码
}
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
//处理开始连接服务的时候的代码
}
};
*连接服务的时候注意,远程调用比较耗时,一般会启动一个线程去做。
-------------------------JavaBean实现Parcelable处理数组属性 值得特别注意地方:要写入数组的长度,然后创建相应的长度的数组 如下代码 注释出,(代码摘之源码)
个人觉得,可以把set和get方法去掉,直接把属性设置为public
public final class TransceiveResult implements Parcelable {
private final boolean mTagLost;
private final boolean mSuccess;
private final byte[] mResponseData;
public TransceiveResult(final boolean success, final boolean tagIsLost,
final byte[] data) {
mSuccess = success;
mTagLost = tagIsLost;
mResponseData = data;
}
public boolean isSuccessful() {
return mSuccess;
}
public boolean isTagLost() {
return mTagLost;
}
public byte[] getResponseData() {
return mResponseData;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mSuccess ? 1 : 0);
dest.writeInt(mTagLost ? 1 : 0);
if (mSuccess) {
dest.writeInt(mResponseData.length);//实现写明数组的长度
dest.writeByteArray(mResponseData);
}
}
public static final Parcelable.Creator<TransceiveResult> CREATOR =
new Parcelable.Creator<TransceiveResult>() {
@Override
public TransceiveResult createFromParcel(Parcel in) {
boolean success = (in.readInt() == 1) ? true : false;
boolean tagLost = (in.readInt() == 1) ? true : false;
byte[] responseData;
if (success) {
int responseLength = in.readInt();//先读取数组的长度,然后创建相应长度的数组读取内容
responseData = new byte[responseLength];
in.readByteArray(responseData);
// byte[] responseData=in.creatByteArray();
//in.readByteArray(responseData);这样写就会报RuntimeException bad array lengths
//因为实现没有给出responseData长度
} else {
responseData = null;
}
return new TransceiveResult(success, tagLost, responseData);
}
@Override
public TransceiveResult[] newArray(int size) {
return new TransceiveResult[size];
}
};
}