在使用各种Server的时候经常会需要调用ServiceManager对象来获取该Server对应的BpServer,这个过程需要使用Binder机制来进行通信。下面是获得MediaPlayerService时的调用过程,其中获取ServiceManager的接口是defaultServiceManager,那么在这里是否也使用了Binder机制呢?对于ServiceManager这个Server来说,Client如果想要获得Service Manager远程接口,却不必通过进程间通信机制来获得,因为Service Manager远程接口是一个特殊的Binder引用,它的引用句柄一定是0。
IMediaDeathNotifier::getMediaPlayerService()
{
ALOGV("getMediaPlayerService");
Mutex::Autolock _l(sServiceLock);
if (sMediaPlayerService == 0) {
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder;
do {
binder = sm->getService(String16("media.player"));
if (binder != 0) {
break;
}
ALOGW("Media player service not published, waiting...");
usleep(500000); // 0.5 s
} while (true);
if (sDe