现象描述
在H5接入一个自动播放声音的页面后,承载H5页面的Activity在finish后声音依旧在后台播放,无法停止,只有结束App进程或者在另外的地方获取系统音频焦点使得webview播放的声音失去音频焦点声音才停止播放。
排查步骤
- Chrome中使用
chrome://inspect
链接ADB设备调试 - finish承载H5页面的Activity
- Chrome中观察到H5页面依旧保留,并没有进行内存回收
解决方案
这个问题很明确——WebView所在的Activity被finish掉后对应webview没有被GC回收。
所以应该在finish对应Activity时主动回收WebView。
但不能简单粗暴在Activity中的onDestory方法中来回收webview,如下:
1 |
|
这样会导致的问题是,当Activity执行onDestory时,可能内部的webview还依附在父类控件中,那么当这个问题成立的时候,就会抛出以下异常,导致程序停止运行:Error: WebView.destroy() called while still attached
所以这个问题的正确解决方案应该是在Activity中的onDetachedFromWindow
方法中进行处理,处理方案如下:
1 |
|