Android WebView基本用法簡介
- 1、WebView作用與應用場景
- 2、WebView常用方法
- 3、WebSettings類:webview與js互動、網頁縮放、網頁編碼格式等等
- 4、WebViewClient類:webview處理頁面攔截、頁面開始載入、頁面結束載入等
- 5、WebChromeClinet類:處理網頁的對話方塊、網站標題等等
- 6、web與native通訊
- 7、webview快取機制及資源預載入
- 8 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);
}