WebView 的一些优化和使用

众所周知、在页面使用webview后,当activity/fragment被finish后webview并不会被释放,所以需要在activity/fragment的onDestroy()/onDestroyView() 方法中手动释放:

通用方法(仅供参考):

    //释放webview
    public static void CleanWebview(WebView webView) {
        if (webView != null) {
            webView.clearHistory();
            ((ViewGroup) webView.getParent()).removeView(webView);
            webView.loadUrl("about:blank");
            webView.stopLoading();
            webView.setWebChromeClient(null);
            webView.setWebViewClient(null);
            webView.destroy();
            webView = null;
        }
    }

webview使用时,需要注意一些WebSettings的设置,比如是否支持js,显示图片等,这里提供部分常用熟悉:

   WebSettings settings = webView.getSettings();

        // 支持javascript
        settings.setJavaScriptEnabled(true);
        // 设置可以访问文件
        settings.setAllowFileAccess(true);
        // 设置可以支持缩放
        settings.setSupportZoom(true);
        // 设置出现缩放工具
        settings.setBuiltInZoomControls(true);
        // 缩放控制器按钮隐藏
        settings.setDisplayZoomControls(false);
        // 扩大比例的缩放
        settings.setUseWideViewPort(true);
        // 自适应屏幕
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);
        } else {
            settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        }
//        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        //显示图片
        settings.setLoadsImagesAutomatically(true);

        settings.setLoadWithOverviewMode(false);
        //开启DOM
        settings.setDomStorageEnabled(true);
        //设定字体大小:
        settings.setTextZoom(100);
        settings.setSupportZoom(true);

        //设置自适应屏幕,两者合用
        settings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        settings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

有时候,需要在网页调起支付宝或者微信支付,咋办呢:

在webView的setWebViewClient()方法中监听shouldOverrideUrlLoading()网页的返回,然后截取,进行自己的操作:调起微信支付或者支付宝支付、

 webView.setWebViewClient(new WebViewClient() {

            /**
             * 网页开始加载
             */
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            /**
             * 网页加载结束
             */
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                //此方法是为了处理在5.0以上Htts的问题,必须加上
                handler.proceed();
//                super.onReceivedSslError(view, handler, error);
            }

            /**
             * 所有跳转的链接都会在此方法中回调
             */
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                if (url.startsWith("weixin://wap/pay?")) {
                    //  如果return false  就会先提示找不到页面,然后跳转微信
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                    // android  6.0 两种方式获取intent都可以跳转支付宝成功,7.1测试不成功
                } else  if (url.startsWith("alipays://") || url.startsWith("alipay://") ) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                } else {
                    //微信支付必须在打开网页前添加Referer
                    Map<String, String> extraHeaders = new HashMap<String, String>();
                    extraHeaders.put("Referer", "https://mobile.yangkeduo.com");
                    view.loadUrl(url, extraHeaders);
                }
                return true;
            }
        });
发布了40 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CGG92/article/details/81709395