* 必须调用父类onTransact处理其他code
*/
returnsuper.onTransact(code, data, reply, flags);
}
}
实现binder代理端
前面介绍了,binder代理对象类会内聚一个binder引用对象,该引用对象通过构造方法传入即可:
publicclassBinderServiceProxyimplementsIBinderService{
/**
* 内聚的binder引用对象
*/
private IBinder remote;
publicBinderServiceProxy(IBinder binder){
if(binder.queryLocalInterface(DESCRIPITON) == null )
remote = binder;
else
thrownew RuntimeException(\this is not a BpBinder.\);
}
@Override
public String getMessage() {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(DESCRIPITON);
try {
remote.transact(GET_MESSAGE,data,reply,0);
} catch (RemoteException e) {
e.printStackTrace();
}
reply.readException();
String msg = reply.readString();
data.recycle();
data.recycle();
return msg;
}
@Override
public IBinder asBinder() {
returnnull;
}
}
这里要特别注意的是,因为binder代理对象类内聚的是一个binder引用对象,所以要对构造方法中传入的Ibinder对象进行检查,保证其是binder引用对象。
然后就是实现服务接口方法,这里很简单了,就是组装Parcel数据,然后利用引用binder对象发起RPC调用。
4. 获取binder引用对象
这就要借助Android中的service组件了,并且以bindService()方法启动该service。
首先定义service组件:
publicclassMyBinderServiceextendsService{
@Nullable
@Override
public IBinder onBind(Intent intent) {
returnnew BinderServiceStub();
}
}
然后在清单文件中,声明该service组件,并且设置process属性,保证该service运行在另外一个进程中:
android:process=\/> 最后以bindService()方式绑定该service: Intent intent = new Intent(); intent.setClass(this,MyBinderService.class); bindService(intent, new ServiceConnection() { @Override publicvoidonServiceConnected(ComponentName name, IBinder service) { if(service.queryLocalInterface(IBinderService.DESCRIPITON)==null){ // 得到binder代理对象 BinderServiceProxy proxy = new BinderServiceProxy(service); // 开始执行方法 Log.i(\,\\+proxy.getMessage()); } } @Override publicvoidonServiceDisconnected(ComponentName name) { }