【学习】从零开始的Android音视频开发(5)——管理调度的服务者MediaPlayerService的产生、添加服务过程

概念

MediaPlayerService是多媒体框架一个非常重要的服务,我们可以理解MediaPlayer是客户端,MediaPlayerService和MediaPlayerService::Client是服务器端。

MediaPlayerService实现IMediaPlayerService定义的业务逻辑,其主要功能是根据MediaPlayer::setDataSource输入的URL调用create函数创建对应的player。

MediaPlayer::Client实现IMediaPlayer定义的业务逻辑,其主要功能包括start、stop、pause等,其是通过调用MediaPlayerService create的player中的对应方法来实现具体功能的

C/S通过IPC的通信流程图

在这里插入图片描述

总结

1.MediaPlayer是客户端
2.MediaPlayerService和MediaPlayerService::Client是服务器端
3.MediaPlayerService实现IMediaPlayerService定义的业务逻辑,其主要功能是根据MediaPlayer::setDataSource输入的URL调用create函数创建对应的player
4.MediaPlayer::Client实现IMediaPlayer定义的业务逻辑,其主要功能包括start、stop、pause等,其是通过调用MediaPlayerService create的player中的对应方法来实现具体功能的
5.通过Transact函数可以向远端的IBinder对象发出调用,通过onTransact函数可以使你自己的远程对象能够响应接收到的调用

相关联的类图

在这里插入图片描述

总结

1.BnXXX派生自public IXXX,PUBLIC BpRefBase.BpXXX派生自public IXXX,PUBLIC BBinder
2.IXXX可以理解为定义业务逻辑,在BpXXX中,把对应的binder_transaction_data打包之后,通过BpRefBase中的mRemote(BpBinder)发送出去,并等待结果。在BnXXX中,实现对应的业务逻辑,通过调用BnXXX派生类中的方法来实现,如MediaPlayerService::Client
3.从下图可以看出IBinder用于进行进程间通信
4.从上图的BpRefBase中有一个remote函数用来与Binder驱动交互使用
5.Binder是用来从Binder驱动中接收相关请求并进行相关处理的
6.BpBinderBinderDriver进行互通

在这里插入图片描述

产生过程

了解一下IMediaPlayerService

在这里插入图片描述

在IMediaPlayerService.h中我们可以看出这里定义了一些常规播放控制接口

接下来查看MediaPlayerService,它的入口是frameworks/base/media/main_mediaserver.cpp

在这里插入图片描述

查看其中的defaultServiceManager函数

在这里插入图片描述

它用的是一个单例,每个进程只需要一个BpServiceManager代理,接下来看看ProcessState::self()->getContextObject(NULL)

在这里插入图片描述

传入的句柄handle值为0,表示ServiceManager,构建一个BpBinder,所以现在相当于gDefaultServiceManager=interface_cast(new BpBinder(0))

然后查看interface_cast

在这里插入图片描述

INTERFACE等价于IServiceManager

然后跟到IServiceManager.h中去

在这里插入图片描述

下面的宏定义存在于IInterface

在这里插入图片描述

DECLARE_META_INTERFACE 这个宏里定义了asInterface, 在IMPLEMENT_META_INTERFACE里实现了它,最终会构造出一个BpServiceManager对象传给intr

总结:句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理

下面分析BpServiceManager

在这里插入图片描述

这里的BpInterface是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类

在这里插入图片描述

然后调用基类BpInterface的构造函数BpInterface<IServiceManager>::BpInterace(const sp<IBinder>& remote) : BpRefBase(remote){},这里的remote就是构造的BpBinder

开始添加服务内部,在frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中,有一个instantiate函数,通过ServiceManager来添加MediaPlayerService服务

在这里插入图片描述

defaultServiceManager返回的是刚创建的BpServiceManager,并调用add函数

BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数

添加服务的过程

分析BpServiceManager的addService函数

在这里插入图片描述

上图的remote()就是前面创建的BpBinder(0)对象

在这里插入图片描述

进入self()->transact

在这里插入图片描述

上图中writeTansactionData发送了ADD_SERVICE_TRANSACTION请求

在这里插入图片描述

以及waitForResponse(部分)

在这里插入图片描述

注意其中的talkWithDriver(部分)

在这里插入图片描述
在这里插入图片描述

IPCThreadState::joinThreadPool、ProcessState::self->startThreadPool进入线程循环,talkWithDriver等待客户端Client请求,从Binder读取命令请求进行处理。到现在为止,MediaPlayerService的服务器端已经向服务总管ServiceManager注册了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值