1、webView的狀態
onResume:激活webview爲活躍狀態,能正常執行網頁響應。
onPasue:當頁面失去焦點或者不可見狀態,執行該方法,表示通知內核暫停所有動作。
pauseTimers,當前應用程序被切換到後臺的時候,該方法會通知全局應用程序的webView暫停所有繪製,解析等動作,降低CPU功耗
resumeTimers
退出釋放
private void releaseWebView() {
if (freedomWebView != null) {
freedomWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
((ViewGroup) freedomWebView.getParent()).removeView(freedomWebView);
freedomWebView.destroy();
freedomWebView = null;
}
}
2、前進與後退
webview.canGoBack 是否可以後退
webview.goBack 後退
webview.canGoForward 是否可以前進
webview.goForward 前進
webview.goBackOrForward(steps),以當前頁面爲基準,前進或者後退steps個頁面。負數前進,負數後退
3、清理緩存
//清除網頁訪問留下的緩存
//由於內核緩存是全局的因此這個方法不僅僅針對webview而是針對整個應用程序.
Webview.clearCache(true);
//清除當前webview訪問的歷史記錄
//只會webview訪問歷史記錄裏的所有記錄除了當前訪問記錄
Webview.clearHistory();
//這個api僅僅清除自動完成填充的表單數據,並不會清除WebView存儲到本地的數據
Webview.clearFormData();
4、緩存模式
//LOAD_CACHE_ONLY: 不使用網絡,只讀取本地緩存數據
//LOAD_DEFAULT: (默認)根據cache-control決定是否從網絡上取數據。
//LOAD_NO_CACHE: 不使用緩存,只從網絡獲取數據.
//LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據。
5、http與https混合加載模式
MIXED_CONTENT_NEVER_ALLOW:Webview不允許一個安全的站點(https)去加載非安全的站點內容(http),比如,https網頁內容的圖片是http鏈接。強烈建議App使用這種模式,因爲這樣更安全。
MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下,WebView是可以在一個安全的站點(Https)里加載非安全的站點內容(Http),這是WebView最不安全的操作模式,儘可能地不要使用這種模式。
MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當涉及到混合式內容時,WebView會嘗試去兼容最新Web瀏覽器的風格。一些不安全的內容(Http)能被加載到一個安全的站點上(Https),
而其他類型的內容將會被阻塞。這些內容的類型是被允許加載還是被阻塞可能會隨着版本的不同而改變,並沒有明確的定義。這種模式主要用於在App裏面不能控制內容的渲染,但是又希望在一個安全的環境下運行。
6、webview與原生native的交互
對於Android調用JS代碼的方法有2種:
通過WebView的loadUrl() mWebView.loadUrl("javascript:callJS()"); 該方法會使得頁面刷新
通過WebView的evaluateJavascript() 該方法不會使頁面刷新,但要求4.4以上,並且有返回值
mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此處爲 js 返回的結果
}
});
對於JS調用Android代碼的方法有3種:
通過WebView的addJavascriptInterface()進行對象映射
通過 WebViewClient 的shouldOverrideUrlLoading ()方法回調攔截 url,雙方定義好相關協議
通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt()消息,參考webChromeClient.
在這些回調方法中一定要對JsResult result對象執行confirm或者cancel方法來釋放js資源,不然會出現卡死
public class AndroidtoJs {
// 定義JS需要調用的方法
// 被JS調用的方法必須加入@JavascriptInterface註解
@JavascriptInterface
public void hello(String msg) {
System.out.println("JS調用了Android的hello方法");
}
}
mWebView.addJavascriptInterface(new AndroidtoJs(), "free");//AndroidtoJS類對象映射到js的free對象
function callAndroid(){
// 由於對象映射,所以調用free對象等於調用Android映射的對象
free.hello("js調用了android中的hello方法");
}
7、webview漏洞處理
1、開啓addJavascriptInterface()會出現當JS拿到Android這個對象後,就可以調用這個Android對象中所有的方法,包括系統類(java.lang.Runtime 類),從而進行任意代碼執行
解決方案:在4.4以上,需要在方法上加上註解 @JavascriptInterface
2、密碼明文存儲漏洞,mWebView.setSavePassword(true)默認是打開的,這樣子密碼會明文存儲
解決方案:WebSettings.setSavePassword(false)
3、setAllowFileAccess()設置是否允許 WebView 使用 File 協議,最好根據webView加載的內容來判斷是否開啓。如果爲false,則不能加載本地html
setAllowFileAccessFromFileURLs()設置是否允許通過 file url 加載的 Js代碼讀取其他的本地文件,最好根據webView加載的內容來判斷是否開啓。
setAllowUniversalAccessFromFileURLs()設置是否允許通過 file url 加載的 Javascript 可以訪問其他的源(包括http、https等源),最好根據webView加載的內容來判斷是否開啓。
8、緩存預加載機制
webView自身緩存機制
瀏覽器 緩存機制:根據 HTTP 協議頭裏的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段來控制文件緩存的機制,參考http緩存機制
Application Cache 緩存機制,它是對瀏覽器緩存機制的補充
// 通過設置WebView的settings來實現
WebSettings settings = getSettings();
String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";
// 1. 設置緩存路徑
settings.setAppCachePath(cacheDirPath);
// 2. 設置緩存大小
settings.setAppCacheMaxSize(20*1024*1024);
// 3. 開啓Application Cache存儲機制
settings.setAppCacheEnabled(true);
// 特別注意
// 每個 Application 只調用一次 WebSettings.setAppCachePath() 和
WebSettings.setAppCacheMaxSize()
Dom Storage 緩存機制:通過webSetting開啓,通過存儲字符串的 Key - Value 對來提供,類似Android 的 SharedPreference機制
Web SQL Database 緩存機制:基於 SQL 的數據庫存儲機制,官方推薦不在使用。
Indexed Database 緩存機制:屬於 NoSQL 數據庫,通過存儲字符串的 Key - Value 對來提供,settings.setJavaScriptEnabled(true);
只需設置支持JS就自動打開IndexedDB存儲機制
自己構建webView緩存
H5頁面有一些更新頻率低、常用 & 固定的靜態資源文件(如JS、CSS文件、圖片等),這些文件的加載,不用通過服務器獲取,直接用本地的即可。
解決方案:通過攔截H5頁面的資源網絡請求 從而 直接從本地讀取資源 而不需要發送網絡請求到服務器讀取。重寫shouldInterceptRequest
步驟: 事先將更新頻率較低、常用 & 固定的H5靜態資源 文件(如JS、CSS文件、圖片等) 放到本地
攔截H5頁面的資源網絡請求 並進行檢測
如果檢測到本地具有相同的靜態資源 就 直接從本地讀取進行替換 而 不發送該資源的網絡請求 到 服務器獲取
或者直接套用本地模板,採用loadDataWithBaseURL方法加載
WebViewClient中方法執行順序
onPageStarted
shouldInterceptRequest 多次執行,每次加載資源前調用,可以進行攔截
onLoadResource 多次執行,開始加載資源
onPageFinished