我是靠谱客的博主 飞快画笔,最近开发中收集的这篇文章主要介绍Android AudioFocus机制小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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传进去了。

简单解释一下:

  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机制小结的全部内容,希望文章能够帮你解决Android AudioFocus机制小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部