初探Android中的binder机制

* 必须调用父类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) {

}

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4