通信节点: /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