前面的博客分析了Binder通信机制中,ServiceManager和服务进程的主要流程。
现在我们看看客户进程是如何查询到服务进程的,以及查询到服务进程后如何使用。
其实在了解了整个Binder通信机制的架构后,剩下的内容就比较好理解了。
我们以MediaServer进程中的MediaPlayerService为例,看看其客户端进程如何通过ServiceManager进行查询。
获取MediaPlayerService的接口定义于IMediaDeathNotifier.cpp中:
const sp<IMediaPlayerService>
IMediaDeathNotifier::getMediaPlayerService()
{
.........
if (sMediaPlayerService == 0) {
//前面博客分析过,通过defaultServiceManager将获取到BpServiceManager
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder;
do {
//利用BpServiceManager的getService函数,获取与MediaPlayerService通信的BpBinder
binder = sm->getService(String16("media.player"));
if (binder != 0) {
break;
}
ALOGW("Media player service not published, waiting...");
usleep(500000); // 0.5 s
} while (true);
...........
//之前的博客已经分析过,这里将利用IInterface的继承体系,用BpBinder构建出BpMediaPlayerService
sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
}
.............
return sMediaPlayerService;
}
1 查询服务
从上面的代码可以看出,查询服务是通过BpServiceManager的getService函数来完成的,传入参数为待获取服务的名称:
virtual sp<IBinder> getService(const String16& name) const
{
unsigned n;
//每次调用都重试5次