Android WebView音频流在应用被杀后续播及状态恢复方案咨询
嘿,这个问题我之前帮不少电台类应用的开发者处理过——Android系统的后台进程限制确实是这类场景的头疼点,尤其是依赖WebView播放音频的情况。咱们一步步拆解解决:
一、让音频在应用被杀后继续播放:改用前台服务+原生MediaPlayer
WebView里的<audio>播放是绑定在Web进程里的,一旦应用主进程被系统回收,Web进程也会跟着挂掉,音频自然就断了。要解决这个,核心是把音频播放的逻辑从WebView移到原生的前台服务中:
- 先从WebView里拿到音频流的URL:可以通过
addJavascriptInterface给网页提供一个原生接口,让网页在<audio>加载完成后,把src地址传给原生代码。比如网页里写window.android.passAudioUrl('你的音频流地址'),原生这边对应实现接收方法。 - 创建前台服务:Android系统对前台服务的优先级远高于普通后台服务,只要你给服务绑定一个可见的通知(Android 8.0+强制要求),系统就不会轻易杀掉它。用原生的
MediaPlayer来加载播放刚才拿到的音频流,完全脱离WebView的依赖。 - 停掉WebView的音频:一旦原生服务开始播放,记得让WebView里的
<audio>暂停或者销毁,避免重复播放。
二、重启时恢复WebView状态(至少原URL)
要实现重启后回到之前的播放页面,关键是提前把状态持久化保存:
- 保存状态:在Activity的
onPause或者onSaveInstanceState方法里,把当前WebView加载的URL(以及如果需要的话,音频播放进度)存到SharedPreferences或者本地数据库里。别依赖WebView自带的saveState,Android 10+之后这个方法的可靠性大打折扣,直接存URL更稳妥。 - 恢复状态:在Activity的
onCreate方法里,先检查持久化存储里有没有保存的URL。如果有,就让WebView重新加载这个URL;同时还要检查前台服务是否还在运行,如果在的话,同步让服务继续播放对应的音频流。 - 应对系统强杀:如果应用是被系统强制杀死后重启的,Android会通过
onCreate的savedInstanceState参数传一些状态,但这个并不靠谱,所以一定要自己做持久化存储。
三、额外避坑提示
- 权限要备齐:别忘了申请
FOREGROUND_SERVICE(Android 9.0+)、WAKE_LOCK(防止设备休眠中断播放)以及网络权限,少一个都可能出问题。 - 适配高版本Android:Android 12+对后台媒体播放有更严格的限制,把前台服务的通知设置成
NotificationCompat.MediaStyle,明确告诉系统这是媒体播放服务,能拿到更高的优先级。 - 测试边缘场景:多切换几个应用、锁屏放超过5分钟,甚至手动在设置里杀掉应用,看看音频会不会继续播放,重启后能不能正常恢复。
内容的提问来源于stack exchange,提问作者Gabriel Morin




