1衫冻、簡介
從 Android 4.4 開始续捂,Android 中的 WebView 不再是基于 WebKit 的,而是開始基于 Chromium轧抗,這個改變使得 WebView 的性能大幅提升恩敌,并且對 HTML5、CSS横媚、JavaScript 有了更好的支持纠炮!
2月趟、作用
顯示和渲染 Web 頁面
直接使用 html 文件(網(wǎng)絡上或本地 assets 中)作布局
可和 JavaScript 交互調(diào)用(簡稱 js)
3、使用介紹
一般來說 Webview 可單獨使用恢口,可聯(lián)合其子類一起使用孝宗,所以接下來,我會介紹:
Webview 自身的常見方法耕肩;
Webview 的最常用的子類:
WebSettings 類因妇、WebViewClient 類、WebChromeClient 類
Android 和 Js 的交互
一猿诸、Webview 常用方法
- 1婚被、WebView 的狀態(tài)
// 激活 WebView 為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁的響應
webView.onResume()梳虽;
// 當頁面失去焦點被切換到后臺不可見狀態(tài)址芯,需要執(zhí)行 onPause
// 通過 onPause 動作通知內(nèi)核暫停所有的動作,比如 DOM 的解析窜觉、plugin 的執(zhí)行谷炸、JavaScript 執(zhí)行。
webView.onPause()禀挫;
// 當應用程序(存在 webview)被切換到后臺時旬陡,這個方法不僅僅針對當前的 webview 而是全局的全應用程序的 webview
// 它會暫停所有 webview 的 layout、parsing语婴、javascripttimer描孟,降低 CPU 功耗。
webView.pauseTimers()
// 恢復 pauseTimers 狀態(tài)
webView.resumeTimers()腻格;
// 銷毀 Webview
// 在關閉了 Activity 時画拾,如果 Webview 的音樂或視頻還在播放,就必須銷毀 Webview
// 但是注意:webview 調(diào)用 destory 時菜职,webview 仍綁定在 Activity 上
// 這是由于自定義 webview 構建時傳入了該 Activity 的 context 對象
// 因此需要先從父容器中移除 webview青抛,然后再銷毀 webview
rootLayout.removeView(webView);
webView.destroy();
- 2、關于前進 / 后退網(wǎng)頁
// 是否可以后退
Webview.canGoBack()
// 后退網(wǎng)頁
Webview.goBack()
// 是否可以前進
Webview.canGoForward()
// 前進網(wǎng)頁
Webview.goForward()
// 以當前的 index 為起始點前進或者后退到歷史記錄中指定的 steps
// 如果 steps 為負數(shù)則為后退酬核,正數(shù)則為前進
Webview.goBackOrForward(intsteps)
常見用法:Back 鍵控制網(wǎng)頁后退
問題:在不做任何處理前提下 蜜另,瀏覽網(wǎng)頁時點擊系統(tǒng)的“Back”鍵,整個 Browser 會調(diào)用 finish() 而結束自身
目標:點擊返回后嫡意,是網(wǎng)頁回退而不是退出瀏覽器
解決方案:在當前 Activity 中處理并消費掉該 Back 事件
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
- 3举瑰、清除緩存數(shù)據(jù)
// 清除網(wǎng)頁訪問留下的緩存
// 由于內(nèi)核緩存是全局的因此這個方法不僅僅針對 webview 而是針對整個應用程序
Webview.clearCache(true);
// 清除當前 webview 訪問的歷史記錄
// 只會清除 webview 訪問歷史記錄里的所有記錄除了當前訪問記錄
Webview.clearHistory();
// 這個 api 僅僅清除自動完成填充的表單數(shù)據(jù)蔬螟,并不會清除 WebView 存儲到本地的數(shù)據(jù)
Webview.clearFormData()此迅;
二、常用類
- 1、WebSettings 類
作用:對 WebView 進行配置和管理
配置步驟 & 常見方法:
配置步驟 1:添加訪問網(wǎng)絡權限(AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET"/>
配置步驟 2:生成一個 WebView 組件(有兩種方式)
// 方式 1:直接在 Activity 中生成
WebView webView = new WebView(this)
// 方法 2:在 Activity 的 layout 文件里添加 webview 控件
WebView webview = (WebView) findViewById(R.id.webView1);
配置步驟 3:進行配置耸序,利用 WebSettings 子類(常見方法)
// 聲明 WebSettings 子類
WebSettings webSettings = webView.getSettings();
// 如果訪問的頁面中要與 Javascript 交互忍些,則 webview 必須設置支持 Javascript
webSettings.setJavaScriptEnabled(true);
// 支持插件
webSettings.setPluginsEnabled(true);
// 設置自適應屏幕,兩者合用
webSettings.setUseWideViewPort(true); // 將圖片調(diào)整到適合 webview 的大小
webSettings.setLoadWithOverviewMode(true); // 縮放至屏幕的大小
// 縮放操作
webSettings.setSupportZoom(true); // 支持縮放坎怪,默認為 true罢坝,是下面那個的前提。
webSettings.setBuiltInZoomControls(true); // 設置內(nèi)置的縮放控件搅窿。若為 false嘁酿,則該 WebView 不可縮放
webSettings.setDisplayZoomControls(false); // 隱藏原生的縮放控件
// 其他細節(jié)操作
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // LOAD_NO_CACHE:不使用緩存,只從網(wǎng)絡獲取數(shù)據(jù)
webSettings.setAllowFileAccess(true); // 設置可以訪問文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 支持通過 JS 打開新窗口
webSettings.setLoadsImagesAutomatically(true); // 支持自動加載圖片
webSettings.setDefaultTextEncodingName("utf-8"); // 設置編碼格式
// 設置 媒體播放需要用戶手勢為 false
// 系統(tǒng)默認設置為 true男应,需要用戶點擊按鈕后才能播放音頻闹司,這樣會導致 webview 加載完成后自動播放音頻的
// 需求實現(xiàn)不了,因為需要用戶點擊之后才能播放
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
settings.setMediaPlaybackRequiresUserGesture(false);
}
常見用法:設置 WebView 緩存
當加載 html 頁面時殉了,WebView 會在 /data/data/ 包名目錄下生成 database 與 cache 兩個文件夾
請求的 URL 記錄保存在 WebViewCache.db开仰,而 URL 的內(nèi)容是保存在 WebViewCache 文件夾下
是否啟用緩存:
// 優(yōu)先使用緩存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 緩存模式如下:
// LOAD_CACHE_ONLY: 不使用網(wǎng)絡,只讀取本地緩存數(shù)據(jù)
// LOAD_DEFAULT:(默認)根據(jù) cache-control 決定是否從網(wǎng)絡上取數(shù)據(jù)
// LOAD_NO_CACHE: 不使用緩存薪铜,只從網(wǎng)絡獲取數(shù)據(jù)
// LOAD_CACHE_ELSE_NETWORK: 只要本地有,無論是否過期恩溅,或者 no-cache隔箍,都使用緩存中的數(shù)據(jù)
// 不使用緩存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
結合使用(離線加載)
if (NetStatusUtil.isConnected(getApplicationContext())) {
// 根據(jù) cache-control 決定是否從網(wǎng)絡上取數(shù)據(jù)
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
} else {
// 沒網(wǎng),則從本地獲取脚乡,即離線加載
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
webSettings.setDomStorageEnabled(true); // 開啟 DOM storage API 功能
webSettings.setDatabaseEnabled(true); // 開啟 database storage API 功能
webSettings.setAppCacheEnabled(true); // 開啟 Application Caches 功能
String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
webSettings.setAppCachePath(cacheDirPath); // 設置 Application Caches 緩存目錄
注意:每個 Application 只調(diào)用一次 WebSettings.setAppCachePath()蜒滩,WebSettings.setAppCacheMaxSize()
- 2、WebViewClient 類
作用:處理各種通知 & 請求事件
常見方法:
常見方法 1:shouldOverrideUrlLoading()
作用:打開網(wǎng)頁時不調(diào)用系統(tǒng)瀏覽器奶稠, 而是在本 WebView 中顯示俯艰;在網(wǎng)頁上的所有加載都經(jīng)過這個方法,這個函數(shù)我們可以做很多操作锌订。
// 步驟 1: 定義 Webview 組件
Webview webview = (WebView) findViewById(R.id.webView1);
// 步驟 2: 選擇加載方式
// 方式 1: 加載一個網(wǎng)頁
webView.loadUrl("http://www.google.com/");
// 方式 2: 加載 apk 包中的 html 頁面
webView.loadUrl("file:///android_asset/test.html");
// 方式 3: 加載手機本地的 html 頁面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
// 步驟 3: 復寫 shouldOverrideUrlLoading() 方法竹握,使得打開網(wǎng)頁時不調(diào)用系統(tǒng)瀏覽器,而是在本 WebView 中顯示
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
常見方法 2:onPageStarted()
作用:開始載入頁面調(diào)用的辆飘,我們可以設定一個 loading 的頁面啦辐,告訴用戶程序在等待網(wǎng)絡響應。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// 設定加載開始的操作
}
});
常見方法3:onPageFinished()
作用:在頁面加載結束時調(diào)用蜈项,我們可以關閉 loading 條芹关,切換程序動作。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
// 設定加載結束的操作
//(不靠譜)–> WebChromeClient.onProgressChanged(靠譜)
}
});
常見方法 4:onLoadResource()
作用:在加載頁面資源時會調(diào)用紧卒,每一個資源(比如圖片)的加載都會調(diào)用一次侥衬。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean onLoadResource(WebView view, String url) {
// 設定加載資源的操作
}
});
常見方法 5:onReceivedError()
作用:加載頁面的服務器出現(xiàn)錯誤時(如 404)調(diào)用。
App 里面使用 webview 控件的時候遇到了諸如 404 這類的錯誤的時候,若也顯示瀏覽器里面的那種錯誤提示頁面就顯得很丑陋了轴总,那么這個時候我們的 app就需要加載一個本地的錯誤提示頁面直颅,即 webview 如何加載一個本地的頁面
// 步驟 1:寫一個 html 文件(error_handle.html),用于出錯時展示給用戶看的提示頁面
// 步驟 2:將該 html 文件放置到代碼根目錄的 assets 文件夾下
// 步驟 3:復寫 WebViewClient 的 onRecievedError 方法
// 該方法傳回了錯誤碼肘习,根據(jù)錯誤類型可以進行不同的錯誤分類處理
webView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
switch(errorCode) {
case HttpStatus.SC_NOT_FOUND:
view.loadUrl("file:///android_assets/error_handle.html");
break;
}
}
});
常見方法 6:onReceivedSslError()
作用:處理 https 請求际乘,webView 默認是不處理 https 請求的,頁面顯示空白漂佩,需要進行如下設置:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // 表示等待證書響應
// handler.cancel(); // 表示掛起連接脖含,為默認方式
// handler.handleMessage(null); // 可做其他處理
}
});
- 3、WebChromeClient 類
作用:輔助 WebView 處理 Javascript 的對話框投蝉、網(wǎng)站圖標养葵、網(wǎng)站標題等等。
常見使用:
常見方法 1:onProgressChanged()
作用:獲得網(wǎng)頁的加載進度并顯示
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress + "%";
progress.setText(progress);
} else {
}
}
});
常見方法2:onReceivedTitle()
作用:獲取 Web 頁中的標題
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
titleview.setText(title)瘩缆;
}
}
- 4关拒、解決用戶在 webview 界面長按后出現(xiàn)復制提示的情況
mWebview.setLongClickable(true);
mWebview.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
避坑!庸娱!webview 如何加載 pdf 着绊?
滿滿的 WebView 優(yōu)化干貨,讓你的H5實現(xiàn)秒開
WebView 是如何拉起軟鍵盤的熟尉?