Android7.0 Binder通信(3) 客户进程查询和使用服务进程

本文介绍了Android7.0中客户端进程如何查询并使用服务进程,以MediaServer进程中的MediaPlayerService为例,详细阐述了通过BpServiceManager的getService函数查询服务,以及BpBinder如何调用服务接口进行业务交互的过程。
摘要由CSDN通过智能技术生成

前面的博客分析了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次
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值