abandonAudioFocus的flow

/frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.java
MediaFocusControl.java --> 这个类才是真正完成requestaudiofocus和abandonaudiofocus操作的

abandonAudioFocusremoveFocusStackEntry(clientId, true /*signal*/, true /*notifyFocusFollowers*/);FocusRequester fr = mFocusStack.pop(); --> 去掉第一个AudioFocus// notify the new top of the stack it gained focusnotifyTopOfAudioFocusStack();//mFocusStack是一个这样的类/frameworks/base/services/core/java/com/android/server/audio/FocusRequester.java// handleFocusGain handleFocusGainFromRequest handleFocusLossmFocusStack.peek().handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);// /frameworks/base/media/java/android/media/IAudioFocusDispatcher.aidl// 实现在这里/frameworks/base/media/java/android/media/AudioManager.javafd.dispatchAudioFocusChange(focusGain, mClientId); //fd --> IAudioFocusDispatcherOnAudioFocusChangeListener listener =fri.mRequest.getOnAudioFocusChangeListener();// mHandler == NULL 所以在 mServiceEventHandlerDelegate中处理final Handler h = (fri.mHandler == null) ? mServiceEventHandlerDelegate.getHandler() : fri.mHandler;final Message m = h.obtainMessage(MSSG_FOCUS_CHANGE/*what*/, focusChange/*arg1*/, 0/*arg2 ignored*/,id/*obj*/);h.sendMessage(m);--> listener.onAudioFocusChange(msg.arg1); //这里就把这个focusChange传进去了。

简单解释一下:

  1. mFocusStack是一个FocusRequester的stack,当requestAudioFocus的时候就会创建一个FocusRequester,并放在这个stack中。
  2. 当abandon的时候,就会去掉顶端的audiofocus(前提是栈顶的audiofocus就是我们要abandon的)。
  3. 将要abandon的focus出栈后,就让新的栈顶的focus处理focus gain的消息。
  4. 消息的处理主要是通过IAudioFocusDispatcher这个类,传给audiomanager的一个内部类mServiceEventHandlerDelegate这个进行处理。
  5. 这个处理函数中会通过这个focus获取到我们request传进来的OnAudioFocusChangeListener 的listener,让listener来处理这个消息(AUDIOFOCUS_GAIN)。

释放过程会有两个flow:(参考http://blog.sina.com.cn/s/blog_645b74b90101e74f.html)
1:如果要释放的client是在栈顶,则释放之后,让下一个栈顶的client获得了audiofocus;
2:如果要释放的client不是在栈顶,则只是移除这个记录,不需要更改当前audiofocus的占有情况。

所以,这样的case的情况下,不论是什么类型的focus(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT 或者AudioManager.AUDIOFOCUS_GAIN …)都是按照栈的顺序来获取focus的。

Android AudioFocus机制小结相关推荐

  1. android decorview动画,Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解...

    Android窗口机制系列 前篇文章中出现了PhoneWindow,DecorView这些类,如果是第一次见过的话,肯定会觉得陌生.这篇文章主要跟大家讲解Window,PhoneWindow,Deco ...

  2. Android 系统(177)---Android消息机制分析:Handler、Looper、MessageQueue源码分析

    Android消息机制分析:Handler.Looper.MessageQueue源码分析 1.前言 关于Handler消息机制的博客实际上是非常多的了. 之前也是看别人的博客过来的,但是过了一段时间 ...

  3. Android 系统(51)Android窗口机制

    Android窗口机制(四)ViewRootImpl与View和WindowManager 2017年01月15日 15:25:49 阅读数:259 在前篇第(三)文章中,我们讲到了在DecorVie ...

  4. Android系统(50)----Android窗口机制

    Android窗口机制(一)认识Android的窗口结构 窗口结构 说明 每一个Activity都包含一个Window对象,Window对象通常由PhoneWindow实现 PhoneWindow:将 ...

  5. Android技能树 — 网络小结(6)之 OkHttp超超超超超超超详细解析

    前言: 本文也做了一次标题党,哈哈,其实写的还是很水,各位原谅我O(∩_∩)O. 介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看 ...

  6. 屏幕刷新机制小结(九)

    Android刷新机制 SurfaceView理解 一.Android屏幕刷新机制 首先需要了解一些基本概念 在一个显示系统里,一般包括CPU.GPU.Display三部分,CPU负责计算数据,把计算 ...

  7. ListView缓存机制小结

    文章目录 ListView缓存机制小结 前言 概述 layout过程 第一次Layout 第二次Layout 滑动事件 参考资料 ListView缓存机制小结 前言 由于本人水平有限,如果文章中出现一 ...

  8. Android Handler机制简单分析

    丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...

  9. Android 广播机制详解

    一.广播的简介 首先,当我们一听到广播这个词时.就可以想到小学是教室的广播.不错Android中的广播机制与我们生活中的广播是有异曲同工之妙的.Android中的发送广播也就像广播室播广播,可以让很多 ...

最新文章

  1. POJ - 3041 Asteroids 二分图最小点覆盖
  2. 最长升序子串1231
  3. open vswitch_Linux Foundation采用Open vSwitch,定义了“开放”和更多开源新闻
  4. This is the default error page for nginx that is distributed with EPEL.
  5. 6年前的Dubbo,2年前的Spring Cloud,都被这个架构干掉了
  6. 大括弧之战 代码风格
  7. 2019 送给每位读者的几点拙见
  8. Atitit.每周计划日程表 流程表 v9 r829.docx
  9. 那个程序员的 Linux 常用软件清单 | Linux 工具篇
  10. 彩信文件服务器,彩信服务器怎么设置
  11. oracle诉讼_Oracle诉Google:Aaaaand诉讼又回来了! [更新]
  12. MATLAB实现光谱曲线包络线去除,附源代码
  13. 在地址栏直接使用Google“手气不错”功能
  14. iOS 11 正式发布!最全功能介绍 + 视频 ...
  15. Android home和back事件处理
  16. 最新初中级前端面试题合集一,你确定不看一看嘛
  17. python重复抽奖_python—抽奖程序
  18. 乐观锁 VS 悲观锁
  19. 单休和双休有多大区别(月薪1万和8千如何选择)
  20. android Easypermission权限管理

热门文章

  1. 管理之道(十) - 你还在崇拜交付速度吗?
  2. Linux中查看各文件夹大小命令du -h --max-depth=1
  3. java例外站点添加不上,java例外站点添加不了
  4. WPF 录屏软件研发心得及思路分享(已结束开发)
  5. 2021年,我们 CSDN App做了什么?
  6. USB接口PCB设计
  7. 5 款必备的免费在线画图工具!超级好用
  8. 服务器主机GHOST装系统,大神请绕道!科普电脑装系统最基本的两种方式,萌新千万不要错过...
  9. 《观察与思考》:相信中国,寻找下一个比尔·盖茨
  10. 【错误汇总】zabbix 监控偶遇问题一记