浅探 Notification sound 的焦点管理

本文探讨了Android中Notification的音频播报流程,通过NotificationManagerService和AudioService启动RingtonePlayer进行播放。通知音频焦点在播放过程中起关键作用,根据duration hint决定是否循环播放及音频焦点的保持。在NotificationPlayer中,未实现复杂的焦点监听,因为通知通常具有高优先级,即使焦点被抢占也会继续播放直到用户确认。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 通知播报流程分析:

Android 中用 NotificationManager 处理通知事务,在构建 Notification 时,一般会传入一个音频地址给其中的 sound 字段进行播报,而播报的处理是通过启动 com.android.server.NotificationManagerService 这个服务来完成的,NotificationManagerService 排队处理 notifications,启动 android.media.AudioService 来获取 com.android.systemui.media.RingtonePlayer,然后实例化一个 com.android.systemui.media.NotificationPlayer 来异步播放 sound,流程图如下:




2. 通知音频焦点分析:

在第五步中的 play() 方法中,NotificationPlayer 在工作线程中通过获取音频焦点来播放指定的铃音:



这就是说,如果需要循环播放则焦点持续标记(duration hint)设为 AUDIOFOCUS_GAIN,否则为 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。因为循环播放时,预示需要持续通知直到用户知道后显式释放焦点为止,一般适合比较紧急的通知,比如来电通知;如果不需要循环播放,则预示是一个临时的音频预警(duration <= 45 s),在用户显式释放焦点之前如果超过临时设定的阈值(45秒)则会自动释放焦点,这一般适用于非紧急的通知,大多数的通知都应是这种情况。

注意:在 NotificationPlayer 中并没有实现 AudioManager.OnAudioFocusChangeListener() 进行更为复杂的焦点得失处理,这样设计的考虑是因为通知机制的优先级通常是高于其它音频应用的,即它一旦开始则即使焦点被抢占也不会放弃播放过程,直到用户确定已知为止。

3. 参考资料:

谷歌工程师 Kristan Uccello 关于音频焦点理论分析和处理的博文:  http://android-developers.blogspot.com/2013/08/respecting-audio-focus.html ,该文主要阐述如何进行音频焦点请求以及各种焦点持续标记(duration hint)的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值