Binder
binder作為android中ipc的機制,應用在android的各個地方。包含了三層(java, C++/C , 驅動)。
binder的目的是實現多個程式之間通訊,之間傳遞的資料有基本資料型別,binder型別,這個包裝在parcel中。
在c++層使用多個類封裝:
主要的類有:
RefBase
關於引用計數Parcel
這個是傳輸的資料容器, 還支援######IBinder物件######的引用。IBinder
binder物件介面,裡面有transact
純虛擬函式BpBinder
binder引用物件,存在於BpRefBase
中,由binder驅動生成該物件BBinder
binder的實體物件IInterface
介面BnInterface
模板類,繼承了IXX 和BBinderBpInterface
模板類, 繼承了IXX和BpRefBaseIPCThreadState
ProcessState
該類生成後,將開啟Binder driver。
用C++編寫binder應用,要有個客戶端程式碼和服務端程式碼,我的一個應用, 主要程式碼有:
客戶端
int main(int argc, char** argv)
{
LOGI("binderclient");
printf("binderclient --\n");
int sum = 0;
sp mTestBinserService;
if (mTestBinserService.get() == 0) {
sp sm = defaultServiceManager();
sp binder;
do {
binder = sm->getService(String16("my.test.binder"));
if (binder != 0)
break;
LOGI("getService fail");
usleep(500000); // 0.5 s
} while (true);
mTestBinserService = interface_cast (binder);
LOGE_IF(mTestBinserService == 0, "no ITestBinserService!?");
}
sum = mTestBinserService->add(3, 4);
LOGI("sum = %d", sum);
return 0;
}
服務端
int main(int argc, char** argv)
{
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
LOGI("TestBinderService before");
//TestBinderService::instantiate();
sm->addService(String16("my.test.binder", new TestBinderService());//TestBinderService繼承於B你Interface, 也就是繼承於ITestBinderService和BBinder.
LOGI("TestBinderService End");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
LOGI("TestBinderService End");
return 0;
}
程式間的回撥
使用binder可以實現程式之間的回撥。Ibinder介面作為函式的引數,就可以了。