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;
            }
        });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章