AudioFocus的使用比较简单,就是使用前申请焦点,使用后释放焦点,
使用过程中如果焦点被抢占,系统会给你的app发送通知。
常见的场景是这样的:
1 进程A当前持有焦点,现在进程B想播放声音,于是B要做下面的事情:
2 使用requestAudioFocus申请焦点,如果返回值是GAIN,表示申请成功,开始播放声音。
3 播完之后,调用abandonAudioFocus释放焦点
4 系统将焦点还回给进程A,进程A恢复播放
但是怪就怪在这个API:
public int requestAudioFocus(OnAudioFocusChangeListener l,int streamType,int durationHint)
public int abandonAudioFocus(AudioManager.OnAudioFocusChangeListener l)
requestAudioFocus 和 abandonAudioFocus 都带了一个Listener对象,在申请和释放焦点的时候,这个对象如果不一样会导致什么的情况?
答案就是在第4步,如果上述request和 abandon带的Listener不是一个对象,系统无法将焦点还回给A
也就是A不能自动播放。
有空从系统源码的角度分析一下这个原因
网友评论