一、首先分析一下ServiceManager内容:ServiceManager提供的业务函数主要是4种:
getServie();
checkService() ;
addService();
listServices().
已经知道,ServiceManager和Server在不同的两个进程中,所以两者之间的通信便会使用binder进行。ServiceManager和Server的关系是ServiceManager是服务端,
Server是客户端,两者之间的业务是Server端首先会向ServiceManager中注册具体的Services,这时沟通要靠binder了。
在这里应该注意的是binder在驱动上对应着一个binder驱动设备,这个binder驱动会在内存上划分出一块共享内存块,实现数据的交互。
现在说说MediaPlayerService这项具体的服务是如何完成在ServiceManager中的注册,binder是如何工作的。在这里还是要注意的是理解binder在业务层上的运用。
在MediaPlayerService.cpp中首先MediaPlayerService要得到这个BpServiceManager对象,使用它才能调用addservice()完成注册。在MediaPlayerService的init函数中
实现:void MediaPlayerService::instantiate(){
defaultServiceManager()->addService(String16("media.player"), new MediaPlayerService());
//这个函数体描述:status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);这个remote()的返回值是BpBinder,这里就是用BpBinder代理工作
这里,已经进入到通信层中的Binder了,这时候就是BpBinder和BBinder的正式工作了。
}
其实业务层用这条语句已经完成了注册任务,表面的工作已经完成,但是要理解的是真正的Binder的BpBinder和BBinder是如何工作的