Car相关
经过一番查找,只有这个地方设置了mFocusListener,我们就拿Car来做研究吧
packages/services/Car/service/src/com/android/car/CarAudioService.java
public void init() { AudioPolicy.Builder builder = new AudioPolicy.Builder(mContext); ... builder.setAudioPolicyFocusListener(mSystemFocusListener); ... }
mSystemFocusListener
//SystemFocusListener是CarAudioService的内部类 private class SystemFocusListener extends AudioPolicyFocusListener { public void onAudioFocusGrant(AudioFocusInfo afi, int requestResult) { ... if (requestResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { synchronized (mLock) { mPendingFocusChanges.addFirst(afi); } mFocusHandler.handleAndroidFocusChange(); } ... } public void onAudioFocusLoss(AudioFocusInfo afi, boolean wasNotified) { //理由没看懂,总之就是这个地方不管不顾不处理回调这种做法安全 // ignore loss as tracking gain is enough. At least bottom listener will be // always there and getting focus grant. So it is safe to ignore this here. } }
mFocusHandler定义:
mFocusHandlerThread = new HandlerThread(CarLog.TAG_AUDIO); mFocusHandler = new CarAudioFocusChangeHandler(mFocusHandlerThread.getLooper());
mFocusHandler.handleAndroidFocusChange
private void handleAndroidFocusChange() { cancelFocusReleaseRequest(); Message msg = obtainMessage(MSG_ANDROID_FOCUS_CHANGE); sendMessage(msg); }
case MSG_ANDROID_FOCUS_CHANGE: doHandleAndroidFocusChange(false /* triggeredByStreamChange */); break;
又碰到一个比较复杂的函数doHandleAndroidFocusChange@CarAudioService
private void doHandleAndroidFocusChange(boolean triggeredByStreamChange) { ... //前面onAudioFocusGrant@SystemFocusListener的时候进行的 //mPendingFocusChanges.addFirst(afi); newTopInfo = mPendingFocusChanges.getFirst(); //这是一个LinkedList。不知道为什么getFirst之后就要马上清掉 mPendingFocusChanges.clear(); ... if (newTopInfo != null) { if (newTopInfo.getGainRequest() == AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) { //新的request是获得暂时的可以duck的 //让之前的老大降级成副手 mSecondaryFocusInfo = mPrimaryFocusInfo; } else { //否则就不设置副手 mSe