What
最近,公司里的老司机在帮测试测app的时候,发现一个bug:android端,用webview打开一个活动页,点击活动页中的音乐进行播放,退出webview之后音乐仍在继续播放。
这个bug之前在浏览技术文章的时候有见过,不过当时只是了解了大致的原因,在脑子里做了个问题的索引,并没有索引解决办法。
不过大致方向有了,就和老司机说“这个bug我来解”
Why
网上说这是Android的一个bug!
HOW
网上解决方法有三种
1.在webview所在activity onPause的时候,调用webView的onPause
不过SDK 11之前是不能直接调用webView的onPause,所以此处可以用版本号判断加反射来解决,如果觉得判断版本号麻烦,也可直接用反射。(测试无效/(ㄒoㄒ)/~~)
2.使用pauseTimers()和resumeTimers()
在activity onPause的时候调用webView.pauseTimers(), onResume的时候调用webView.resumeTimers(),暂停/启动本app中所有webview的layout解析和js执行。(测试还是无效 (╯°Д°)╯︵ ┻━┻ )
3.退出的时候载入一个空白的网页
这样退出时有效的,但是按Home键(回到主屏)或者电源键(关闭主屏)还是无效。(ಥ_ಥ)
以下代码来自网络:
本着 山不过来,我就过去 的思想,想了一会儿(当然不是一直在想这句话-。-),发现js可以暂停audio的播放,而webview又可以执行js代码,豁然开朗啊!
在onPause的时候通过jsInterface来判断网页中是否有audio?是否在播放?在播放就暂停,onResume的时候再恢复。
以下是核心代码:
PS
以上只处理了单个audio播放的情况,如果有多个audio,需要遍历所有audio进行判断以及注意状态的缓存
Reference
WebView 完全退出flash的方法,停止声音的播放
How to stop youtube video playing in Android webview?
Issue 10282: Public API for WebView.onPause and WebView.onResume