1.bbinder binder實體對象
2.bpbinder binder引用對象
3.binder代理對象
4.ibinder bbinder 和bpbinder都繼承與ibinder
注意:應用需要使用的是binder的代理對象,使用前需要將引用對象轉換成代理對象。
ICameraService.Stub.asInterface(binder);
defaultServiceManager 拿到的是serviceManager 其實也是一個binder服務
getService()是拿到的普通binder服務
例子
class BpExampleService : public BpInterface<IExampleService>
{
virtual int get()
{
Parcel data,reply;
data.writeInterfaceToken(IexampleService::getInterfaceDescriptor());
remote()->transact(EXAMPLE_GET,data,&reply); //remote()函數得到Binder引用對象的指針,然后調用它的transcat() 此函數會調用IPCThread類的函數來向驅動傳遞數據
最后到了onTransact方法調用遠程實體對象ExampleService 類對應的方法
return reply.readInt();
}
}
status_t BnExampleService::onTransact(...)
{
switch(code)
{
case EXAMPLE_GET:
CHECK_INTERFACE(IExampleService,data,reply);
reply->writeInt(get()); //調用get方法
break;
case EXAMPLE_SET:
CHECK_INTERFACE(IExampleService,data,reply);
set(data->readInt()); //調用set方法
break;
default:
return BBinder::onTransact(code,data,reply,flags);
}
}
圖片參考此處http://www.cnblogs.com/winfu/p/6061296.html
新聞熱點
疑難解答