问题:
Android webview有一个bug,就是当承载webview的Activity被停止后(onStop),该webview的进程还会持续一段时间。这个问题在网页正在播放视频或音频时十分明显,退出Activity之后还会继续播放一段时间的声音。该问题在http://www.2cto.com/kf/201501/366465.html中也提了出来,并提供了一些解决方案。
解决方案:
1.调用webview api onPause
protected void onPause() {
super.onPause();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webView.onPause(); // 暂停网页中正在播放的视频
}
}
2.使用webview加载空白页面
web.pauseTimers();
web.stopLoading();
web.loadData("", "text/xml", "utf-8");
3.调用系统音频应用,发送暂停指令
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
mContext.sendBroadcast(i);
4.加载空白页
web.loadData("about:blank");
经过测试,以上方法都不太好用,一些存在适配问题。最近做这需求时遇到这个问题,想到了用js注入的方法在Activity退出时利用js代码暂停网页中正在播放的视频。在终端上用webview播放的视频一般是用到H5中的video标签,所以js代码很容易实现,而且效果不错。
JS注入
在Activity的onPause()加入
protected void onPause() {
super.onPause();
String jsCode = "(function(){ var video = docment.getElementsByTagName('video')[0]; video.pause(); })()";
mWebview.loadUrl("javascript: "+jsCode);
}
其实核心代码是里面的JS代码。如果考虑到H5中存在多个视频的话,可以进行遍历暂停。
function() {
var videos = docment.getElementsByTagName('video');
for(var i=0; i<videos.length; i++){
if(!videos[i].paused){
videos[i].pause()
}
}
}