WebView

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 是如何拉起軟鍵盤的熟尉?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末归露,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斤儿,更是在濱河造成了極大的恐慌剧包,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往果,死亡現(xiàn)場離奇詭異疆液,居然都是意外死亡,警方通過查閱死者的電腦和手機陕贮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門堕油,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飘蚯,你說我怎么就攤上這事馍迄。” “怎么了局骤?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵攀圈,是天一觀的道長。 經(jīng)常有香客問我峦甩,道長赘来,這世上最難降的妖魔是什么现喳? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮犬辰,結果婚禮上嗦篱,老公的妹妹穿的比我還像新娘。我一直安慰自己幌缝,他們只是感情好灸促,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涵卵,像睡著了一般浴栽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轿偎,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天典鸡,我揣著相機與錄音,去河邊找鬼坏晦。 笑死萝玷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的昆婿。 我是一名探鬼主播球碉,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仓蛆!你這毒婦竟也來了汁尺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤多律,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搂蜓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼荞,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年帮碰,在試婚紗的時候發(fā)現(xiàn)自己被綠了相味。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡殉挽,死狀恐怖丰涉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斯碌,我是刑警寧澤一死,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站傻唾,受9級特大地震影響投慈,放射性物質(zhì)發(fā)生泄漏承耿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一伪煤、第九天 我趴在偏房一處隱蔽的房頂上張望加袋。 院中可真熱鬧,春花似錦抱既、人聲如沸职烧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚀之。三九已至,卻和暖如春择克,著一層夾襖步出監(jiān)牢的瞬間恬总,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工肚邢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壹堰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓骡湖,卻偏偏與公主長得像贱纠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子响蕴,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容