通信節點: /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