概述
abandonAudioFocus的flow
/frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.java
MediaFocusControl.java --> 这个类才是真正完成requestaudiofocus和abandonaudiofocus操作的
abandonAudioFocus
removeFocusStackEntry(clientId, true /*signal*/, true /*notifyFocusFollowers*/);
FocusRequester fr = mFocusStack.pop(); --> 去掉第一个AudioFocus
// notify the new top of the stack it gained focus
notifyTopOfAudioFocusStack();
//mFocusStack是一个这样的类/frameworks/base/services/core/java/com/android/server/audio/FocusRequester.java
// handleFocusGain handleFocusGainFromRequest handleFocusLoss
mFocusStack.peek().handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);
// /frameworks/base/media/java/android/media/IAudioFocusDispatcher.aidl
// 实现在这里/frameworks/base/media/java/android/media/AudioManager.java
fd.dispatchAudioFocusChange(focusGain, mClientId); //fd --> IAudioFocusDispatcher
OnAudioFocusChangeListener 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传进去了。
简单解释一下:
- mFocusStack是一个FocusRequester的stack,当requestAudioFocus的时候就会创建一个FocusRequester,并放在这个stack中。
- 当abandon的时候,就会去掉顶端的audiofocus(前提是栈顶的audiofocus就是我们要abandon的)。
- 将要abandon的focus出栈后,就让新的栈顶的focus处理focus gain的消息。
- 消息的处理主要是通过IAudioFocusDispatcher这个类,传给audiomanager的一个内部类mServiceEventHandlerDelegate这个进行处理。
- 这个处理函数中会通过这个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机制小结的全部内容,希望文章能够帮你解决Android AudioFocus机制小结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复