WebView加载HTML5视频退出后无法停止播放问题解决办法

2016-07-16 00:33 阅读 6,026 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/1969.html

一.摘要

WebView加载网络视频,退出当前Activity或Fragment后,WebView没有停止播放视频,进程继续在后台执行的原因,结束WebView视频播放的方法。如果使用在API 11以上版本,最简单的解决办法,重写的onPause()方法,同样回调WebView的onPause()方法。

二.WebView退出继续播放视频的原因?

WebView播放视频,开启了一个后台进程,当退出Activity或Fragment的时候,finish它们,并没有kill掉或者pause掉开启的process,这个时候就会出现上述提到退出activity或fragment时,继续播放视频的情况。

所以,第一感觉解决这个问题的方法,kill掉开启的后台进程,可以参考WebView提供的API文档,在提供的方法中,找到了两个方法destroy()onPause(),前者销毁WebView内部状态,后者暂停与WebView,DOM,JavaScript等有关的额外进程,还有一个onResume()方法,恢复onPause()暂停的进程,那么就可以考虑使用者三个方法处理WebView退出后继续播放视频的问题。

  1. @Override  
  2. protected void onPause() {  
  3.     mWebView.onPause();  
  4.     super.onPause();  
  5. }  
  6.   
  7. @Override  
  8. protected void onResume() {  
  9.     mWebView.onResume();  
  10.     super.onResume();  
  11. }  
  12.   
  13. @Override  
  14. protected void onSaveInstanceState(Bundle outState) {  
  15.     mWebView.saveState(outState);  
  16.     super.onSaveInstanceState(outState);  
  17. }  
  18.   
  19. @Override  
  20. protected void onDestroy() {  
  21.     mWebView.destroy();  
  22.     mWebView = null;          
  23.     super.onDestroy();  
  24. }  

PS:onResume(),onPause()是在Android 3.0版本添加的方法,destroy()是各个版本都存在的方法,同时调用destroy()方法是在WebView从View System删除后。

第二种解决办法:

针对Android 3.0以下版本,参考stackoverflow网站的说法,试图加载一个本地不存在的url,迫使WebView清空当前加载的视频数据,结束已开启的进程。

  1. webview.loadUrl("file:///android_asset/nonexistent.html");  

第三种解决办法:

为了可以兼容各个版本的Android API,思路和上面两者一样,试图通过调用onPause()方法和加载空的url,在方法上有所区别。比如:通过反射的机制调用WebView的onPause()方法

  1. @Override  
  2. public void onPause() {  
  3.     super.onPause();  
  4.   try {  
  5.   
  6.      Class.forName("android.webkit.WebView")  
  7.     .getMethod("onPause", (Class[]) null)  
  8.     .invoke(webview, (Object[]) null);  
  9.   
  10.      } catch (ClassNotFoundException cnfe) {  
  11.               
  12.      } catch (NoSuchMethodException nsme) {  
  13.   
  14.      } catch (InvocationTargetException ite) {  
  15.   
  16.      } catch (IllegalAccessException iae) {  
  17.   
  18.    }  
  19. }  

或者加载空的url

  1. @Override  
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.      
  4.     if(keyCode==event.KEYCODE_BACK)  
  5.     {  
  6.         mWebview.loadUrl("");  
  7.         mWebview.stopLoading();  
  8.         finish();  
  9.     }  
  10.     return super.onKeyDown(keyCode, event);  
  11. }  

上述的几种方法,感觉都不是直接kill掉process进程,只是通过停止进程清除数据方式,在使用的过程中,可能还有其他直接kill掉process的方法,找到的时候再添加。

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/1969.html
分类:Android 标签:,
关于如何解决“NoClassDefFoundError”错误的问题? 关于如何解决“NoClassDefFo
Android Debug Bridge Android Debug Bridge
LinkedHashMap方法解析 LinkedHashMap方法解析
重置路由器电脑网络显示黄色叹号怎么办? 重置路由器电脑网络显示黄色叹号

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情