[Android]對ServiceManager的理解

通信節點: /dev/binderhtml

什麼時候打開:通常在ProcessState::self()android

什麼時候用:透過BBinder, BpBinder.net

管理者BpServiceManager , BnServiceManager

    它們會經過IPCThreadState::transact()等進行操做, handle在這裏指定。結構binder_transaction_data 用來讀寫數據。 remote()->transact()就是BpBinder->transact(), 再到IPCThreadState::transact()

BpBinder不在繼承關係裏,只是打包數據。代理

Binder 通信Thread什麼時候起來:unix

某個service死掉,要如何知道:code

ServiceManager的handle 是0htm

int main(int argc, char** argv)

{對象

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();


MediaPlayerService::instantiate();

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}blog

C++層本身寫個process 來啓動特定的service.繼承

在Java層,寫好service後,能夠經過在SystemServer中啓動一個thread來啓動service

Framework service須要aidl文件,而native service(如media.player)則不須要。

sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);是對應IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");裏的asInterface(): 實現從IBinder 到BpMediaPlayerService(obj)的轉換,通常的,若是obj爲0 表示service manager自己的handle. 注意,該轉換在local和remote的地方,是不一樣的。 以下示例:

void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService()); }

//獲取ServiceManager的代理對象 sp<IServiceManager> sm = defaultServiceManager(); //經過ServiceManager獲取media Service binder binder = sm->getService(String16("media.player")); //將binder封裝 構造media Service代理對象 BpMediaPlayerService sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);

參考: http://blog.csdn.net/luoshengyang/article/details/6621566

http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

http://www.cnblogs.com/bastard/archive/2012/11/13/2766611.html

http://blog.csdn.net/zbunix/article/details/8758631

相關文章
相關標籤/搜索