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的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值