美文网首页
WebView使用(二)--状态管理与常用类

WebView使用(二)--状态管理与常用类

作者: jeffrey12138 | 来源:发表于2020-08-13 17:35 被阅读0次

    WebView的状态管理有五个方法:
    1、onPause() 使页面当前的WebView停止
    2、onResume()使页面当前的WebView恢复
    3、pauseTimers()使当前页面全部的WebView停止
    4、resumeTimers()是当前页面全部的WebView恢复
    5、destroy()销毁WebView,这个方法很重要,因为尝试在销毁Activity的时候发现,WebView并没有销毁,这样会导致内存泄漏的问题

    @Override
        protected void onPause() {
            super.onPause();
            webView.onPause();
            /*webView.pauseTimers();*/
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            webView.onResume();
            /*webView.resumeTimers();*/
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            webView.destroy();
        }
    

    然后说下WebView的常用类:
    主要是三个常用类:
    1、WebSettings:对WebView进行配置和管理,比如,通过
    WebSettings控制网页的缩放,以及缓存等等;
    2、WebViewVClient:处理webview加载时的各种回调通知,比如,网页在开始加载的回调,加载更多资源的回调,网页跳转时的回调等等;
    3、WebChromeClient:辅助webView去处理javaScript对话框、进度等,比如网页弹出的对话框,网页的进度条等等;

    现在先介绍下WebSettings的使用方法:
    1、控制javaScript代码运行(这是踩坑才发现的,因为有些网页是通过javaScript控制的,而在android里面是默认不允许javaScript代码运行的,所以导致加载的网页会乱或者JS交互部分没有办法显示)
    下面是没有设置WebSettings的网页:


    image.png

    代码如下:

    public class MainActivity extends AppCompatActivity {
    private WebView webView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            webView=findViewById(R.id.webview);
            webView.loadUrl("http://www.baidu.com/");
            webView.setWebViewClient(new WebViewClient());
            
        }
    }
    

    而添加了之后:

    WebSettings webSettings=webView.getSettings();
            webSettings.setJavaScriptEnabled(true);
    
    image.png

    2、控制网页的缩放

    //设置支持缩放功能
            webSettings.setSupportZoom(true);
            //设置支持内置的缩放控件
            webSettings.setBuiltInZoomControls(true);
            //设置显示原生的缩放控件
            webSettings.setDisplayZoomControls(true);
    

    3、控制webview的缓存方式

    //永远不使用网络,只去本地缓存,没有缓存则不会加载
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
            //只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            //系统默认的缓存方法,根据cache-control决定是否从网络获取
            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
            //永远不适用缓存,只从网络获取最新的内容
            webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    //清除缓存的方法
            webView.clearCache(true);
    

    注意:第1和2条代码的使用,有个使用弊端,就是只要本地有缓存都会去使用本地缓存,而不管网页的有啥变化,
    然后cache-control可能小伙伴会有点疑惑,就大概解释下:
    这个是在nodejs中实现的,node的是体现在app.js中代码

    这句的意思是控制缓存时间为10秒
    app.use(cacheControl({
        maxAge 10
    }));
    

    那这个的实际影响是什么呢?也就是说,如果网页内容发生了变化,但是我们在客户端上面如果在10秒之内刷新的话,是看不到新的变化,但是过了10秒之后再刷新就可以看到了

    然后继续说下WebViewVClient:
    在我们使用webview的过程中,如果没有加入

    webView.setWebViewClient(new WebViewClient());
    

    这句代码的时候,发现webview依然可以正常加载,但是如果我们在去使用它跳转其他网页的时候,你会发现,打开的是手机默认的浏览器而不是我们的APP。

    然后我们开始验证下WebViewVClient的用法:

     webView.setWebViewClient(new WebViewClient(){
                //此方法是在android5.0以上才可以使用的,但是这个request可以调用更多的方法
                @Nullable
                @Override
                public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+request.getUrl().toString());
                    }
                    return super.shouldInterceptRequest(view, request);
                }
                //此方法是任何版本都可以使用的
                @Nullable
                @Override
                public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                    Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+url);
                    return super.shouldInterceptRequest(view, url);
                }
    
                //参数1:是webview自身,参数2:是进行请求的URL,参数3:在网页标签上展示的图标
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    Log.e("WebViewActivity","webview->onPageStarted 网页开始进行加载url:"+url);
                    super.onPageStarted(view, url, favicon);
    
                }
    
                @Override
                public void onLoadResource(WebView view, String url) {
                    Log.e("WebViewActivity","webview->onLoadResource 网页开始加载资源url:"+url);
                    super.onLoadResource(view, url);
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    Log.e("WebViewActivity","webview->onPageFinished 网页加载完成url:"+url);
                }
            });
    

    通过打印可以看到他们的执行顺序:

    image.png

    可以看到,每个控件或者网页内容,都会执行shouldInterceptRequest()->onPageStarted()->onLoadResource()->onPageFinished(),但是注意看下最后的onPageFinished()只执行了一次

    地址拦截:

    webView.setWebViewClient(new WebViewClient(){
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    //当跳转的地址为百度的时候,拦截下来,并跳转到搜狗的网页
                    if ("http://www.baidu.com/".equals(url)){
                        view.loadUrl("http://www.sogou.com/");
                        return true;
                    }
                    return super.shouldOverrideUrlLoading(view, url);
                }
    

    但报错的时候,为了提升客户使用感受,我们可以在代码中进行处理:

     webView.setWebViewClient(new WebViewClient(){
    
                //参数2:错误的代码,参数3:错误的描述信息,参数4:访问错误的url
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    //在这里可以对于setWebViewClient发生错误的时候,进行处理动作,例如跳转到我们制定的页面之类的
                    super.onReceivedError(view, errorCode, description, failingUrl);
                }
    

    最后,说下WebChromeClient

    webView.setWebChromeClient(new WebChromeClient(){
               //获取网页加载进度
               @Override
               public void onProgressChanged(WebView view, int newProgress) {
                   super.onProgressChanged(view, newProgress);
               }
               //获取网页标题
               @Override
               public void onReceivedTitle(WebView view, String title) {
                   super.onReceivedTitle(view, title);
               }
               //下面三种方法是对网页弹出的三种类型的对话框进行处理, 注意下,这三个方法都是返回boolean类型的值,
               // 当返回是false的时候,就是由WebView进行处理,反之就是我们自己去处理,同时需要用result来进行调用
               @Override
               public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                   return super.onJsAlert(view, url, message, result);
               }
    
               @Override
               public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                   return super.onJsConfirm(view, url, message, result);
               }
    
               @Override
               public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                   return super.onJsPrompt(view, url, message, defaultValue, result);
               }
           });
        }
    
    

    好啦!今天的介绍到了这里,希望大家都可以学得明明白白吧,我已经写得很详细了,如果大家还有疑问,可以在下方留言,我每天都会看的!!

    相关文章

      网友评论

          本文标题:WebView使用(二)--状态管理与常用类

          本文链接:https://www.haomeiwen.com/subject/cwwidktx.html