安卓之 MediaSessionService
一、 核心角色
媒体控制的“管理员”和“快递员”
MediaSessionService 是一个运行在 系统进程 中的核心服务,它的角色可以概括为:
- 管理员:管理和记录所有活跃的 MediaSession(媒体会话)。每个正在播放媒体的应用都会创建一个 MediaSession 并向该服务注册。
 - 交通警察:负责将硬件媒体按键(如耳机上的播放/暂停键)、车载系统指令等全局媒体控制事件,准确无误地分发给当前“最应该”接收它的应用。
 
二、核心机制
1. 媒体会话优先级栈管理
• MediaSessionStack:服务内部维护了一个优先级栈 来管理所有会话,而不是简单的队列。
• 优先级决定因素:
播放状态:正在播放的会话优先级高于暂停的会话。
会话活动:最近被控制的会话会被提升到栈顶。
系统优先级:某些系统级会话(如语音助手)可以设置为高优先级。
• 价值:这种机制确保了当用户按下媒体键时,系统总能准确地控制当前最前台、最相关的媒体应用,避免了多个应用(如音乐和播客App同时运行)之间的控制冲突。
2. 媒体按键事件的精确分发
- 事件接收:硬件按键事件首先被系统底层捕获,并传递到 MediaSessionService。
 - 会话选择:Service 查询内部的优先级栈,找到位于栈顶的、有效的 MediaSession 作为目标会话。
 - 事件分发:将按键事件(如 ACTION_PLAY)通过 Binder IPC 传递给目标会话所属的应用进程。
 - 应用处理:目标应用接收到事件后,执行相应的逻辑(如开始播放),并更新自身的播放状态和界面。
 
