6.4 MediaPlayerService和它的Client

前面一直在讨论ServiceManager和它的Client,现在我们以MediaPlayerService的Client来进行分析,换换口味吧。由于ServiceManager不是从BnServiceManager中派生的,所以之前没有讲请求数据是如何从通信层传递到业务层并进行处理的。本节,我们以MediaPlayerService和它的Client作为分析对象,试着解决这些遗留问题。

6.4.1 查询ServiceManager

前文曾分析过ServiceManager的作用,一个Client想要得到某个Service的信息,就必须先和ServiceManager打交道,通过调用getService函数来获取对应Service的信息。请看来源于IMediaDeathNotifier.cpp中的例子getMediaPlayerService(),它的代码如下所示:


[—>IMediaDeathNotifier.cpp]

/*

这个函数通过与ServiceManager通信,获得一个能够与MediaPlayerService通信的BpBinder,然后再通过障眼法interface_cast,转换成一个BpMediaPlayerService。

*/

IMediaDeathNotifier:getMediaPlayerService()

{

sp<IServiceManager>sm=defaultServiceManager();

sp<IBinder>binder;

do{

//向ServiceManager查询对应服务的信息,返回BpBinder。

binder=sm->getService(String16("media.player"));

if(binder!=0){

break;

}

//如果ServiceManager上还没有注册对应的服务,则需要等待,直到对应服务注册

//到ServiceManager中为止。

usleep(500000);

}while(true);

/*

通过interface_cast,将这个binder转化成BpMediaPlayerService,

binder中handle标识的一定是目的端MediaPlayerService。

*/

sMediaPlayerService=interface_cast<IMediaPlayerService>(binder);

}

return sMediaPlayerService;

}


有了BpMediaPlayerService,就能够使用任何IMediaPlayerService提供的业务逻辑函数了。例如createMediaRecorder和createMetadataRetriever等。

显而易见的是,调用的这些函数都将把请求数据打包发送给Binder驱动,并由BpBinder中的handle值找到对应端的处理者来处理。这中间的过程如下所示:

(1)通信层接收到请求。

(2)递交给业务层处理。

想进一步了解这中间的过程吗?下面就对此做详细分析。