WebView相關方法解析

WebView相關操作

.
.
.

1.加載網頁的四種方式

2.控制網頁的前進和後退

3.Webview狀態管理

4.webview相關常用類簡介

5.控制JS運行

6.控制網頁的大小和縮放

7.緩存策略

8.WebViewClient

9.資源請求回調

10.地址攔截

11.WebViewClient發生錯誤時的處理

12.WebChromeClient處理網頁信息

13.android調用JS代碼

14.JS調用android代碼

1.加載網頁的四種方式:

1.1 loadUrl(String url)
這個url可以是web的URL:loadUrl(“https://www.csdn.net/”);

也可以是本地資源文件下的html頁面:loadUrl("file:///android_asset/index.html");

說手機SD卡中的頁面:
loadUrl(webView.loadUrl("file://"+Environment.getExternalStorageDirectory().getPath()+"index.html")

1.2 loadUrl(String url,Map<String,String> addidionalHttpHeaders)
這個方法是在上述方法的基礎上添加了 ddidionalHttpHeaders 參數。這個參數會被添加到RequestHeaders中。
使用方法;

    webView.setWebViewClient(new WebViewClient()
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            //這裏放入了我們自定義的請求頭
                Map<String,String > reqHeaders = new HashMap<>();
                reqHeaders.put("header_key","panghu");
                webView.loadUrl(url,reqHeaders);
                return super.shouldOverrideUrlLoading(view, request);
            }
        });

1.3 loadData(String data,String mimeType,String encoding)
這個方法允許我們將一段html代碼加載到我們的webview中。
使用方法:

webView.loadData("<h1>HelloWord</>","text/html","utf-8");

1.4 loadData(String baseUrl,String data,String minmeType,Sstring historyUrl)
這個方法是在上邊的代碼的基礎上增加了一個baseUrl和historyUrl參數。這個代表了將baseUrl和data拼接起來之後的路徑。historyUrl代表了點擊後退時候所跳轉的代碼。

2.控制網頁的前進和後退
所有的前進後者後退都是依靠瀏覽歷史來決定的
關鍵方法如下:
2.1boolean canGOBack():是否可以後退
2.2 boolean canGoForward():是否可以前進
2.3boolean canGoBackOrForward(int step):是否可以前進或者後退指定步數(正爲前進,負爲後退)
2.4 void goBack():後退到上一頁
2.5 void goForward():前進到下一頁
2.6 void goBackOrForward(int steps):前進或者後退到指定步數的頁面
2.7 void clearHistory():清空歷史記錄

3.Webview狀態管理:
類似Activity擁有生命週期,webview擁有類似的狀態管理:
onPause():通知內核暫停當前網頁上的所有動作
onResume():通知內核回覆當前網頁上的所有動作
onPauesTimers():通知內核暫停所有網頁上的動作
onResumeTimers():通知內核恢復所有網頁的動作
destory():銷燬WebVIew

這些回調函數與Activity的回調函數應該搭配起來使用

4.webview相關常用類簡介:
1.webSettings:對webView進行配置和管理
2.WebViewClient:處理網頁加載的回調通知
3.WebChromeClient::輔助webview去處理JS對話框標題進度等

5.控制允許JS運行:
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);

6.控制網頁的縮放:
setSupportZoom(boolean):是否支持縮放
setBuiltInZoomControls(boolwan):設置內置的縮放控件
setDisplayZoomControls(boolean):是否顯示原生縮放控件

7.緩存策略:

wetSettings.setCacheMode(MODE_NAME);
MODE_NAME有以下幾種方式
**LOAD_CACHE_ONLY:**永遠不使用緩存
**LOAD_CACHE_ELSE_NETWORK:**只要本地有緩存就使用本地緩存,本地沒有緩存就加載網絡資源
LOAD_DEFAULT(默認):根據cache_control決定是否使用緩存
**LOAD_NO_CACHE:**永遠不使用緩存,只從網絡獲取

8.WebViewClient:
處理網頁的各種回調通知

        webView.setWebViewClient(new WebViewClient()
        {
            /**
             *在webview進行請求之前進行回調 
             * @param view
             * @param url
             * @return
             */
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);
            }

            /**
             * 在webview進行請求之前進行回調 ,僅在5.0以後可以使用
             * @param view
             * @param request
             * @return
             */
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }

            /**
             * 在網頁加載的 時候進行回調
             * @param view
             * @param url
             * @param favicon
             */
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            /**
             * 網頁開始加載資源
             * @param view
             * @param url
             */
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            /**
             * 網頁加載完畢
             * @param view
             * @param url
             */
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });

10.地址攔截
同樣在webclient的回調方法中,有一個方法爲:
boolwan shouldOverrideUrlLoading(WebView view ,String url):在將要加載新的url的時候進行回調

 		  @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                return super.shouldInterceptRequest(view, url);
            }


		 /**
             * 
             * @param view
             * @param request
             * @return 返回false的時候代表webview進行處理新的請求,返回true的時候代表我們進行處理
             */
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
			if("http://www.baidu.com".equals(request.getUrl()))
				{
					view.loafUrl("http://www.mooc.com")
					return true;
				}
                return super.shouldOverrideUrlLoading(view, request);
            }

11.WebViewClient發生錯誤時的處理:


            /**
             * 在6.0以後使用
             * @param view
             * @param request
             * @param error
             */
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

12.WebChromeClient處理網頁信息:
幾個重要的回調方法:

 webView.setWebChromeClient(new WebChromeClient()
        {
            /**
             * 獲取網頁加載的進度
             * @param view
             * @param newProgress
             */
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }

            /**
             * 獲取網頁的標題
             * @param view
             * @param title
             */
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }

            /**
             * 網頁將要打開一個Alert的時候進行回調
             * @param view
             * @param url
             * @param message
             * @param result
             * @return 返回爲false的時候表示webview對此彈出處理,返回true的時候代表我們進行處理  
             */
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            /**
             * 在網頁將要打開一個confirm對話框的時候進行回調
             * @param view
             * @param url
             * @param message
             * @param result
             * @return 返回爲false的時候表示webview對此彈出處理,返回true的時候代表我們進行處理  
             */
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            /**
             * 在網頁將要打開一個Prompt對話框的時候進行回調
             * @param view
             * @param url
             * @param message
             * @param defaultValue
             * @param result
             * @return 返回爲false的時候表示webview對此彈出處理,返回true的時候代表我們進行處理  
             */
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
        });

在後面三個彈出框中,如果我們要自行處理邏輯,需要將我們的結果返回給JS代碼。我們可以利用result這個參數的result.confirm()或者result.cancel().方法來將結果提交給JS

13.android調用JS代碼:

webview.loadUrl("javaScript::${functionName}") //不需要返回值時調用
//需要返回值時調用 api>19
  webView.evaluateJavascript("javascript:${functionName}", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {
                
            }
        });

14.JS調用android代碼:

在上方我們進行訪問攔截的時候,我們獲取到將要跳轉的域名,然後根據域名來進行攔截。其實我們也可以用域名來傳遞某些信息:假設我們的域名爲“android://print?msg = 123”.
那我們就可以根據這個域名來抵用我們安卓本地的print方法。代碼如下:

  @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Uri uri = Uri.parse(url);
                if("android".equals(uri.getScheme()))//協議名爲android,表示爲商定好的協議
                {
                    String funcName = uri.getAuthority();
                    if ("print".equals(funcName))
                    {
                        String msg = uri.getQueryParameter("msg");
                        print(msg);
                    }
                }
                return true;
            }

  private void print(String msg) {
        Log.d("panghu", "print: "+msg);
    }

這樣就完成了JS調用Android代碼的功能。當我們需要返回一些數據的時候,我們可以利用android調用JS的方法時候,將數據作爲參數調用JS的固定方法。

使用對象映射的方式(在4.2之後可以使用):
首先我們要有一個映射類:

public class DemoObject {

    @JavascriptInterface
    public String print(String msg)
    {
        Log.d(TAG, "print: "+msg);
        return "fanhuizhi";
    }
}

然後調用:

webView.addJavascriptInterface(new DemoObject(),"android");

爲這個類的對象起一個名字“android”。然後再html中,我們有一個JS函數是這樣的:

function getMsg()
{
	var result = android.print("hahaha") //這個result就是android代碼給我們的返回值
}

關於WebView的使用就是這些,有不足的地方後續再完善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章