一.摘要
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退出后继续播放视频的问题。
- @Override
- protected void onPause() {
- mWebView.onPause();
- super.onPause();
- }
- @Override
- protected void onResume() {
- mWebView.onResume();
- super.onResume();
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- mWebView.saveState(outState);
- super.onSaveInstanceState(outState);
- }
- @Override
- protected void onDestroy() {
- mWebView.destroy();
- mWebView = null;
- super.onDestroy();
- }
PS:onResume(),onPause()是在Android 3.0版本添加的方法,destroy()是各个版本都存在的方法,同时调用destroy()方法是在WebView从View System删除后。
第二种解决办法:
针对Android 3.0以下版本,参考stackoverflow网站的说法,试图加载一个本地不存在的url,迫使WebView清空当前加载的视频数据,结束已开启的进程。
- webview.loadUrl("file:///android_asset/nonexistent.html");
第三种解决办法:
为了可以兼容各个版本的Android API,思路和上面两者一样,试图通过调用onPause()方法和加载空的url,在方法上有所区别。比如:通过反射的机制调用WebView的onPause()方法
- @Override
- public void onPause() {
- super.onPause();
- try {
- Class.forName("android.webkit.WebView")
- .getMethod("onPause", (Class[]) null)
- .invoke(webview, (Object[]) null);
- } catch (ClassNotFoundException cnfe) {
- } catch (NoSuchMethodException nsme) {
- } catch (InvocationTargetException ite) {
- } catch (IllegalAccessException iae) {
- }
- }
或者加载空的url
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if(keyCode==event.KEYCODE_BACK)
- {
- mWebview.loadUrl("");
- mWebview.stopLoading();
- finish();
- }
- return super.onKeyDown(keyCode, event);
- }
上述的几种方法,感觉都不是直接kill掉process进程,只是通过停止进程清除数据方式,在使用的过程中,可能还有其他直接kill掉process的方法,找到的时候再添加。
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1969.html ,谢谢支持!