申请音频焦点时序图
2022-09-21 11:28:07 0 举报
音频焦点申请最详细的时序图
作者其他创作
大纲/内容
申请音频焦点,同步等待结果mAudioManager.requestAudioFocus(mAudioFocusRequest)
在焦点管理栈mFocusStack中,移除申请方之前的申请并释放相关资源
AudioService
同步返回AudioManager实例
如果系统设置了多音频焦点管理
需要进行延迟获取焦点
否,大于100,返回获取焦点失败
否,继续向下
是否注册有外部音频策略
添加音频焦点变化回调,当音频焦点变化时候通知AppregisterAudioFocusRequest(mAudioFocusRequest)
binder同步回调
申请方的用途、权限、包名等检查
通知焦点栈中的其他申请者焦点丢失如果已经通知过则不通知
通过binder给音频焦点申请方 增加一个linkToDeath回调,如果对应的进程死掉,会通知音频焦点进行释放
打印开始Log:MediaFocusControlrequestAudioFocus() from uid xxx
同步通知App申请失败
当前音频焦点在电话且不允许延迟获取焦点
否,变化了 ,继续执行
同步通知App申请成功
否,继续向下执行
音频交焦点申请栈mFocusStack.size()<100
是
因为进程已经死,binder服务关闭,这个回调到这里就不继续分发
通知申请方焦点申请成功
binder
等待线程锁,保证解析来数据操作一致性
App
检查通过:mMediaFocusControl.requestAudioFocus
其他应用释放音频焦点,占有音频焦点应用的音频焦点申请 FocusRequester从mFocusStack出栈
申请方已持有焦点,申请时候用途没有变化
申请AudioManager实例
success
多音频管理策略,
binder回调
AudioManager
获取应用包名、版本号等信息,通过binder向系统申请音频焦点:mAudioService.requestAudioFocus
MediaFocusControl
fail
组建AudioFocusRequest:设置申请类型、音频属性、是否可以异步获取、音频焦点变化回调等
申请进程不存活,返回获取焦点失败
外部音频策略处理
是的,返回获取焦点失败
异步通知App申请焦点成功
是的,用途没有变,重复申请,直接返回获取成功
当前栈顶App获取焦点
利用binder检测申请进程是否存活
把这个焦点申请插入到焦点管理栈mFocusStack电话类焦点下面,这样当电话App释放焦点,它就能获取焦点,异步获取
0 条评论
下一页
为你推荐
查看更多