6.5.3 匿名Service
匿名Service就是没有注册的Service,这句话是什么意思?
没有注册意味着这个Service没有在ServiceManager上注册。
它是一个Service又表示它确实是一个基于Binder通信的C/S结构。
再看下面的代码,或许就会明白是什么意思了。
[—>IMediaPlayerService.cpp]
status_t BnMediaPlayerService:onTransact(uint32_t code,const Parcel&data,
Parcel*reply,uint32_t flags)
{
switch(code){
case CREATE_URL:{
CHECK_INTERFACE(IMediaPlayerService,data,reply);
……
//player是一个IMediaPlayer类型的对象。
sp<IMediaPlayer>player=create(
pid,client,url,numHeaders>0?&headers:NULL);
//下面这句话也很重要。
reply->writeStrongBinder(player->asBinder());
return NO_ERROR;
}break;
当MediaPlayerClient调用create函数时,MediaPlayerService会返回一个IMediaPlayer对象,此后,MediaPlayerClient即可直接使用这个IMediaPlayer来进行跨进程的函数调用了。
请看,这里确实也存在C/S的两端:
BpMediaPlayer,由MediaPlayerClient使用,用来调用IMediaPlayer提供的业务服务。
BnMediaPlayer,由MediaPlayerService使用,用来处理来自Client端的业务请求。
上面明显是一个C/S结构,但在ServiceManager中,肯定没有IMediaPlayer的信息,那么BpMediaPlayer是如何得到BnMediaPlayer的handle值的呢?
注意 handle事关通信的目的端,因此它非常重要。
答案可能就在下面这句话中:
reply->writeStrongBinder(player->asBinder());//将Binder类型作为一种特殊数据类型处理。
当这个reply写到Binder驱动中时,驱动可能会特殊处理这种IBinder类型的数据,例如为这个BBinder建立一个独一无二的handle,这其实相当于在Binder驱动中注册了一项服务。
通过这种方式,MS输出了大量的Service,例如IMediaPlayer和IMediaRecorder等。
说明 关于这个问题,也可以查看驱动的实现来验证这一想法。