目錄.jpg
1. 簡(jiǎn)介
WebView是一個(gè)基于webkit引擎起意、展現(xiàn)web頁(yè)面的控件。
2. 作用
- 顯示和渲染W(wǎng)eb頁(yè)面
- 直接使用html文件(網(wǎng)絡(luò)上或本地assets中)作布局
- 可和JavaScript交互調(diào)用
- 在使用Webview時(shí),請(qǐng)記得在AndroidManifest.xml文件中聲明
3. 使用介紹
一般來(lái)說(shuō)Webview可單獨(dú)使用峭范,可聯(lián)合其子類一起使用掀亥,所以接下來(lái)涵亏,我會(huì)介紹:
- Webview自身的常見方法;
- Webview的最常用的子類 (WebSettings類发乔、WebViewClient類、WebChromeClient類)
- Android和Js的交互
3.1 Webview常用方法
3.1.1 WebView的狀態(tài)
//激活WebView為活躍狀態(tài)雪猪,能正常執(zhí)行網(wǎng)頁(yè)的響應(yīng)
webView.onResume() 栏尚;
//當(dāng)頁(yè)面被失去焦點(diǎn)被切換到后臺(tái)不可見狀態(tài),需要執(zhí)行onPause
//通過(guò)onPause動(dòng)作通知內(nèi)核暫停所有的動(dòng)作只恨,比如DOM的解析译仗、plugin的執(zhí)行、JavaScript執(zhí)行官觅。
webView.onPause()纵菌;
//當(dāng)應(yīng)用程序(存在webview)被切換到后臺(tái)時(shí),這個(gè)方法不僅僅針對(duì)當(dāng)前的webview而是全局的全應(yīng)用程序的webview
//它會(huì)暫停所有webview的layout休涤,parsing咱圆,javascripttimer。降低CPU功耗功氨。
webView.pauseTimers()
//恢復(fù)pauseTimers狀態(tài)
webView.resumeTimers()序苏;
//銷毀Webview
//在關(guān)閉了Activity時(shí),如果Webview的音樂(lè)或視頻捷凄,還在播放忱详。就必須銷毀Webview
//但是注意:webview調(diào)用destory時(shí),webview仍綁定在Activity上
//這是由于自定義webview構(gòu)建時(shí)傳入了該Activity的context對(duì)象
//因此需要先從父容器中移除webview,然后再銷毀webview:
rootLayout.removeView(webView);
webView.destroy();
3.1.2 關(guān)于前進(jìn) / 后退網(wǎng)頁(yè)
//是否可以后退
Webview.canGoBack()
//后退網(wǎng)頁(yè)
Webview.goBack()
//是否可以前進(jìn)
Webview.canGoForward()
//前進(jìn)網(wǎng)頁(yè)
Webview.goForward()
//以當(dāng)前的index為起始點(diǎn)前進(jìn)或者后退到歷史記錄中指定的steps
//如果steps為負(fù)數(shù)則為后退,正數(shù)則為前進(jìn)
Webview.goBackOrForward(intsteps)
常見用法:Back鍵控制網(wǎng)頁(yè)后退
- 問(wèn)題:在不做任何處理前提下 纵势,瀏覽網(wǎng)頁(yè)時(shí)點(diǎn)擊系統(tǒng)的“Back”鍵,整個(gè) Browser 會(huì)調(diào)用 finish()而結(jié)束自身
- 目標(biāo):點(diǎn)擊返回后踱阿,是網(wǎng)頁(yè)回退而不是推出瀏覽器
- 解決方案:在當(dāng)前Activity中處理并消費(fèi)掉該 Back 事件
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
3.1.3 清除緩存數(shù)據(jù)
清除網(wǎng)頁(yè)訪問(wèn)留下的緩存
由于內(nèi)核緩存是全局的因此這個(gè)方法不僅僅針對(duì)webview而是針對(duì)整個(gè)應(yīng)用程序.
Webview.clearCache(true);
清除當(dāng)前webview訪問(wèn)的歷史記錄
只會(huì)webview訪問(wèn)歷史記錄里的所有記錄除了當(dāng)前訪問(wèn)記錄
Webview.clearHistory()管钳;
這個(gè)api僅僅清除自動(dòng)完成填充的表單數(shù)據(jù)钦铁,并不會(huì)清除WebView存儲(chǔ)到本地的數(shù)據(jù)
Webview.clearFormData();
3.2 常用類
3.2.1 WebSettings類
- 作用:對(duì)WebView進(jìn)行配置和管理
- 配置步驟 & 常見方法:
- 配置步驟1:添加訪問(wèn)網(wǎng)絡(luò)權(quán)限(AndroidManifest.xml)
INTERNET權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/>
- 進(jìn)行配置-利用WebSettings子類(常見方法)
//聲明WebSettings子類
WebSettings webSettings = webView.getSettings();
//如果訪問(wèn)的頁(yè)面中要與Javascript交互才漆,則webview必須設(shè)置支持Javascript
webSettings.setJavaScriptEnabled(true);
//支持插件
webSettings.setPluginsEnabled(true);
//設(shè)置自適應(yīng)屏幕牛曹,兩者合用
webSettings.setUseWideViewPort(true); //將圖片調(diào)整到適合webview的大小
webSettings.setLoadWithOverviewMode(true); // 縮放至屏幕的大小
//縮放操作
webSettings.setSupportZoom(true); //支持縮放,默認(rèn)為true醇滥。是下面那個(gè)的前提黎比。
webSettings.setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件。若為false鸳玩,則該WebView不可縮放
webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控件
//其他細(xì)節(jié)操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關(guān)閉webview中緩存
webSettings.setAllowFileAccess(true); //設(shè)置可以訪問(wèn)文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過(guò)JS打開新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自動(dòng)加載圖片
webSettings.setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式
常見用法:設(shè)置WebView緩存
- 當(dāng)加載 html 頁(yè)面時(shí)阅虫,WebView會(huì)在/data/data/包名目錄下生成 database 與 cache 兩個(gè)文件夾
- 請(qǐng)求的 URL記錄保存在 WebViewCache.db,而 URL的內(nèi)容是保存在 WebViewCache 文件夾下
- 是否啟用緩存:
//優(yōu)先使用緩存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//緩存模式如下:
//LOAD_CACHE_ONLY: 不使用網(wǎng)絡(luò)不跟,只讀取本地緩存數(shù)據(jù)
//LOAD_DEFAULT: (默認(rèn))根據(jù)cache-control決定是否從網(wǎng)絡(luò)上取數(shù)據(jù)颓帝。
//LOAD_NO_CACHE: 不使用緩存,只從網(wǎng)絡(luò)獲取數(shù)據(jù). //LOAD_CACHE_ELSE_NETWORK,只要本地有购城,無(wú)論是否過(guò)期吕座,或者no-cache,都使用緩存中的數(shù)據(jù)瘪板。
//不使用緩存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
3.2.2 WebViewClient類
- 作用:處理各種通知 & 請(qǐng)求事件
- 常見方法:
- 常見方法1:shouldOverrideUrlLoading()
- 作用:打開網(wǎng)頁(yè)時(shí)不調(diào)用系統(tǒng)瀏覽器吴趴, 而是在本W(wǎng)ebView中顯示;在網(wǎng)頁(yè)上的所有加載都經(jīng)過(guò)這個(gè)方法,這個(gè)函數(shù)我們可以做很多操作侮攀。
//步驟1. 定義Webview組件
Webview webview = (WebView) findViewById(R.id.webView1);
//步驟2. 選擇加載方式
//方式1. 加載一個(gè)網(wǎng)頁(yè):
webView.loadUrl("http://www.google.com/");
//方式2:加載apk包中的html頁(yè)面
webView.loadUrl("file:///android_asset/test.html");
//方式3:加載手機(jī)本地的html頁(yè)面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
//步驟3. 復(fù)寫shouldOverrideUrlLoading()方法锣枝,使得打開網(wǎng)頁(yè)時(shí)不調(diào)用系統(tǒng)瀏覽器, 而是在本W(wǎng)ebView中顯示
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
常見方法2:onPageStarted()
- 作用:開始載入頁(yè)面調(diào)用的魏身,我們可以設(shè)定一個(gè)loading的頁(yè)面惊橱,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//設(shè)定加載開始的操作
}
});
常見方法3:onPageFinished()
- 作用:在頁(yè)面加載結(jié)束時(shí)調(diào)用箭昵。我們可以關(guān)閉loading 條税朴,切換程序動(dòng)作。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
//設(shè)定加載結(jié)束的操作
}
});
常見方法4:onLoadResource()
- 作用:在加載頁(yè)面資源時(shí)會(huì)調(diào)用家制,每一個(gè)資源(比如圖片)的加載都會(huì)調(diào)用一次正林。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean onLoadResource(WebView view, String url) {
//設(shè)定加載資源的操作
}
});
常見方法5:onReceivedError()
- 作用:加載頁(yè)面的服務(wù)器出現(xiàn)錯(cuò)誤時(shí)(如404)調(diào)用。
App里面使用webview控件的時(shí)候遇到了諸如404這類的錯(cuò)誤的時(shí)候颤殴,若也顯示瀏覽器里面的那種錯(cuò)誤提示頁(yè)面就顯得很丑陋了觅廓,那么這個(gè)時(shí)候我們的app就需要加載一個(gè)本地的錯(cuò)誤提示頁(yè)面,即webview如何加載一個(gè)本地的頁(yè)面
常見方法6:onReceivedSslError()
- 作用:處理https請(qǐng)求 webView默認(rèn)是不處理https請(qǐng)求的涵但,頁(yè)面顯示空白杈绸,需要進(jìn)行如下設(shè)置:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); //表示等待證書響應(yīng)
// handler.cancel(); //表示掛起連接,為默認(rèn)方式
// handler.handleMessage(null); //可做其他處理
}
});
3.2.3 WebChromeClient類
作用:輔助 WebView 處理 Javascript 的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站標(biāo)題等等矮瘟。
常見使用:
-
常見方法1: onProgressChanged()
- 作用:獲得網(wǎng)頁(yè)的加載進(jìn)度并顯示
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頁(yè)中的標(biāo)題
- 每個(gè)網(wǎng)頁(yè)的頁(yè)面都有一個(gè)標(biāo)題瞳脓,比如www.baidu.com這個(gè)頁(yè)面的標(biāo)題即“百度一下,你就知道”澈侠,那么如何知道當(dāng)前webview正在加載的頁(yè)面的title并進(jìn)行設(shè)置呢劫侧?
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
titleview.setText(title);
}
webSetting.png
webChromeClient.png
webViewClient.png
goback.png
參考資料地址: http://blog.csdn.net/carson_ho/article/details/52693322 哨啃,此文僅用于收藏整理烧栋。