核心內容
Binder機制的核心實際上和Android中的Handler發送消息的機制很像,在Binder中負責發消息的是繼承了BpInterface的子類,負責處理消息的是BnInterface的子類android
發送消息的具體函數是函數
status_t transact(uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0);
1
處理消息的具體函數是ui
status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags)
1
基礎知識
BpInterface和BpBinder中的p表示的意思就是proxy,表示中間的調用和代理,不會具體實現功能
BnInterface和BBinder中的n表示的意思就是native 是最終實現的地方
BpBinder類由client來繼承,固然,若是用不上的話,也能夠不用繼承
若是一個類想使用android中的智能指針,就必須繼承或者間接繼承RefBase類,好比client
繼承關係
定義一個接口類IDemo,繼承IInterface
定義一個BpDemoService類,繼承BpInterface<IDemo>
定義一個BnDemoService類,繼承BnInterface<IDemo>
定義一個DemoService類,繼承BnDemoService,用來實現具體的函數
定義一個接口類IDemo,繼承IInterface,裏面只有一個函數
class IDemo :public IInterface
{
public:
virtual int getAge();
}代理
定義一個BpDemoService類,繼承BpInterface
enum
{
CUSTOM_CODE = IBinder::FIRST_CALL_TRANSACTION
};
class BpDemoService: public BnInterface<IDemo>
{
public:
BpDemoService(const sp<IBinder>& impl):BpInterface<IDemo> (impl){};
virtual BOOL getAge()
{
Parcel data, reply;
data.writeInterfaceToken(IDemo::getInterfaceDescriptor());
remote()->transact(CUSTOM_CODE, data, &reply);
return (BOOL)reply.readInt32();
}
}指針
定義一個BnDemoService類,繼承BnInterface
class BnDemoService: public BnInterface<IDemo>
{
public:
virtual status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags= 0 );
};code
status_t BnDemoService::onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags)
{
switch(code)
{
case CUSTOM_CODE:
{
CHECK_INTERFACE(IDemo,data,reply);
int res = getAge();
reply->writeInt32((int32_t)res);
return NO_ERROR;
}
break;
default:
break;
}
return BBinder::onTransact(code, data, reply, flags);
}繼承
定義一個Service類,繼承BnDemoService
用來具體實現函數,最後記得別忘了調用IMPLEMENT_META_INTERFACE宏來進行註冊接口
class DemoService : public BnDemoService,public BinderService<DemoService>
{
public:
int getAge();
}
IMPLEMENT_META_INTERFACE(DemoService, "demo.service");ip
調用順序
在client端調用的時候,首先獲取ServiceManager
而後建立一個binder用來裝載service
使用interface_cast()來得到對應的代理端
經過代理端調用在service中實現的函數
sp < IServiceManager > sm = defaultServiceManager();
sp < IBinder > binder;
binder = sm->getService(String16("demo.service"));
sp<IDemo> m_pDemoService;
m_pDemoService = interface_cast<IDemo> (binder);
m_pDemoService->getAge();rem
重點函數
interface_cast()函數
做用是把從getService獲取到的Binder強制轉換爲IInterface的子類,也就是定義了本身的那些接口的類
函數原型
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
asInterface這個函數是IMPLEMENT_META_INTERFACE宏中進行定義的。具體能夠參考
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
const android::String16 I##INTERFACE::descriptor(NAME); \
const android::String16& \
I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::sp<I##INTERFACE> intr; \
if (obj != NULL) { \
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) { \
intr = new Bp##INTERFACE(obj);/* IMPORTENT */ \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { }
22
也就是說interface_cast函數最後返回的其實是new BpDemoService(binder);
remote()->transact()函數
位置是在代理類中調用的,用來遠程給onTransact函數發送消息和數據的,相似於handler.sendMessage()
函數原型
status_t BBinder::transact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1
onTransact()函數
這個函數的位置是在實現類(實現BnInterface)中的,至關於hander中的handleMessage函數
函數原型
virtual status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags= 0 );