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

2016-07-16 00:33 阅读 10,996 次 评论 0 条

一.摘要

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的方法,找到的时候再添加。

你可能感兴趣的文章

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处: https://www.teachcourse.cn/1969.html ,谢谢支持!

资源分享

分类:Android 标签:,
HashMap方法解析 HashMap方法解析
ArrayMap方法解析 ArrayMap方法解析
关于如何解决“NoClassDefFoundError”错误的问题? 关于如何解决“NoClassDefFo
Map接口集合方法解析 Map接口集合方法解析