1.媒体应用架构概览
如何将媒体播放器应用分为媒体控制器(用于界面)和媒体会话(用于实际播放器)来解决音频app开发中遇到的后台播放,数据传输,播放控制等问题
2.使用
首先看一下整体架构简图
和我们用浏览器访问网站的模式类似,先打开页面链接上MediaBrowserService服务,链接成功后通过MediaController来控制播放/暂停/上下一首,MediaSession来相应对应的控制回调,播放器的回调会通过MediaSession.setPlaybackState()更新给客户端.
如上:有四个核心类
MediaBrowser
媒体浏览器,用来连接MediaBrowserService和订阅数据,通过它的回调接口我们可以获取和Service的连接状态以及获取在Service中异步获取的音乐库数据。也就是我们的浏览器端.
MediaBrowserService
浏览器服务,提供onGetRoot(控制客户端媒体浏览器的连接请求,通过返回值决定是否允许该客户端连接服务)和onLoadChildren(媒体浏览器向Service发送数据订阅时调用,一般在这执行异步获取数据的操作,最后将数据发送至媒体浏览器的回调接口中)这两个抽象方法 同时MediaBrowserService还作为承载媒体播放器(如MediaPlayer、ExoPlayer等)和MediaSession的容器。也就是我们的音乐后台服务
MediaSession
媒体会话,即受控端,通过设置MediaSessionCompat.Callback回调来接收媒体控制器MediaController发送的指令,当收到指令时会触发Callback中各个指令对应的回调方法(回调方法中会执行播放器相应的操作,如播放、暂停等)。Session一般在Service.onCreate方法中创建,最后需调用setSessionToken方法设置用于和控制器配对的令牌并通知浏览器连接服务成功,主要通过MediaSession和客户端的MediaController交互
MediaController
媒体控制器,在客户端中开发者不仅可以使用控制器向Service中的受控端发送指令,还可以通过设置MediaControllerCompat.Callback回调方法接收受控端的状态,从而根据相应的状