1. 程式人生 > 實用技巧 >Android WebView基本用法簡介

Android WebView基本用法簡介

目錄

1、WebView作用與應用場景

作用:(1)顯示和渲染html5頁面;(2)直接使用html檔案作為佈局,包括網路html檔案以及本地assets中html檔案;(3)可以和JavaScript互動

html5與安卓原生比較

使用者體驗 web App native App
需要下載 即用即得 需要
應用可實現功能 大部分 全部
響應速度 一般
UI 幾乎可實現任意效果UI 可實現任意效果UI
影音功能

原生應用場景:使用者體驗、資料安全、流量轉化
html5應用場景:頁面風格無系統要求、互動少、點選深度比較深

2、WebView常用方法

載入一個網頁
webView.loadUrl("https://www.google.com/")

載入assets資料夾下的html檔案
webView.loadUrl("file:///android_asset/test.html")

載入手機本地的html頁面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html")

啟用webview為活躍狀態,能夠執行網頁的響應
webView.onResume();

頁面失去焦點被切換到後臺不可見狀態,需要執行onPause, 通知核心暫停所有的動作,包括DOM的解析,plugin的執行,JavaScript執行
webView.onPause();

當應用程式被切換到後臺時,暫停應用中所有webview的layout、parsing、javacripttimer,降低CPU功能
webView.pauseTimers();

恢復pauseTimers狀態
webView.resumeTimers();

銷燬webview:當關閉Activity時,如果webview的音樂或視訊還在播放,就必須銷燬webview, 這時需要解除webview與Activity的關聯,先從父容器中移除webview再銷燬webview
webView.removeView(webView); webView.destroy();

是否可以後退
webView.canGoBack();

後退網頁
webView.goBack();

是否可以前進
webView.canGoForward();

前進網頁
webView.goForward();

以當前的index為起點前進或者後退到歷史記錄中指定的steps, steps為負表示後退,為正表示前進
webView.goBackOrForward(int steps);

Back控制網頁後退:如果不做任何處理, 點選back鍵, 當前Activity會結束,可以重寫Activity的onKeyDown事件,由WebView處理Back鍵,實現Back鍵控制網頁後退的功能,

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { 
	webView.goBack(); 
	return true; 
    } 
    return super.onKeyDown(keyCode, event);
}

清除網頁訪問留下的快取, 核心快取時全域性的,因此針對整個應用程式
webView.clearCache(true);

清除當前webview訪問歷史記錄,保留當前訪問記錄
webView.clearHistory();

清除自動完成填充的表單資料,不會清除webview儲存到本地的資料
webView.clearFormData();

3、WebSettings類:webview與js互動、網頁縮放、網頁編碼格式等等

獲取WebSetting類
WebSettings webSettings = webView.getSettings();

允許頁面進行js互動(如果js有執行動畫,需要在onStop和onResume中分別禁止和開啟js互動,以減少cpu、電量等資源消耗)
webSettings.setJavaScriptEnabled(true);

支援外掛
webSettings.setPluginsEnabled(true);

設定螢幕自適應

webSettings.setLoadWithOverviewMode(true); //縮放至螢幕的大小

縮放操作

webSettings.setSupportZoom(true);// 支援縮放,setBuiltInZoomControls設定為true為前提
webSettings.setBuiltInZoomControls(true); //設定內建的縮放控制元件,若為false,則webview不可縮放
webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控制元件 

其他細節操作

webSettings.setCacheMode(WebSettings.Load_CACHE_ELSE_NETWORK); //關閉webview中快取
webSettings.setAllowFileAccess(true); //設定可以訪問檔案
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支援通過js開啟新視窗
webSettings.setLoadsImagesAutomatically(true); //支援自動載入圖片
webSettings.setDefaultTextEncodingName("utf-8"); //設定編碼格式

4、WebViewClient類:webview處理頁面攔截、頁面開始載入、頁面結束載入等

重寫shouldOverrideUrlLoading方法,攔截一些url等等

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
    } 
});

重寫onPageStarted、onPageFinished方法,顯示或者結束進度條等等

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      //載入開始的操作 
    } 

    @Override
    public void onPageFinished(WebView view, String url) {
        //結束後的操作
    }
    
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        //頁面載入錯誤後的操作,如顯示一個錯誤頁面等等
    }
});

資源載入等

webView.setWebViewClient (new WebViewClient() { 
    @Override public void onLoadResource(WebView view, String url) { 
    //對資源的處理等等 
    } 
});

5、WebChromeClinet類:處理網頁的對話方塊、網站標題等等

獲取網站載入進度,用於顯示進度條等等

webView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public void onProgressChanged(WebView view, int newProgress) {

    }
});

獲取網站標題並顯示

webView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public void onReceivedTitle(WebView view, String title) { 	
       //獲取網頁標題
    }
});

處理js對話方塊,包括警告框、確認框和輸入框, 返回true表示native要處理。

webView.setWebChromeClient(new WebChromeClient() { 
        @Override
    public boolean onJsAlert(final 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);
    }
});

6、web與native通訊

6.1 native呼叫js

備註:JS程式碼呼叫一定要在onPageFinished()回撥之後才能呼叫

6.1 js呼叫native

7、webview快取機制及資源預載入

7.1 快取機制

7.2 快取模式

LOAD_DEFAULT:根據cache-control決定是否從網路中獲取資料
LOAD_CACHE_ELSE_NETWORK:只要本地有快取就使用快取
LOAD_NO_CACHE:不使用快取
LOAD_CACHE_ONLY:只讀取本地快取

7.3 webview預載入

webview可提前構建快取,重複使用

8 webview漏洞問題

8.1 任意程式碼執行漏洞

WebView 中 addJavascriptInterface() : Android4.2之後被呼叫函式以@JavascriptInterface註解避免漏洞攻擊
WebView 內建匯出的 searchBoxJavaBridge_物件
WebView 內建匯出的 accessibility 和 accessibilityTraversalObject 物件

8.2 密碼明文儲存漏洞

webview預設開啟密碼儲存功能,在使用者輸入密碼時會彈出提示框:詢問使用者是否儲存密碼,如果是,密碼會被明文儲存到 /data/data/com.package.name/databases/webview.db中,有密碼洩露的風險。
解決方案:關閉密碼儲存提醒
webSettings.setSavePassword(false);

8.3 域控制不嚴格漏洞

即 A 應用可以通過 B 應用匯出的 Activity 讓 B 應用載入一個惡意的 file 協議的 url,從而可以獲取 B 應用的內部私有檔案,從而帶來資料洩露威脅
解決方案:

// 需要使用 file 協議 
setAllowFileAccess(true); 
setAllowFileAccessFromFileURLs(false); 
setAllowUniversalAccessFromFileURLs(false); // 禁止 file 協議載入 JavaScript 
if (url.startsWith("file://") { 
    setJavaScriptEnabled(false); 
} else { 
    setJavaScriptEnabled(true); 
}