Android WebView詳解

目錄.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 哨啃,此文僅用于收藏整理烧栋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拳球,隨后出現(xiàn)的幾起案子审姓,更是在濱河造成了極大的恐慌庇谆,老刑警劉巖壳鹤,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钩乍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)画畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門砸琅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人轴踱,你說(shuō)我怎么就攤上這事症脂。” “怎么了淫僻?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诱篷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雳灵,道長(zhǎng)棕所,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任悯辙,我火速辦了婚禮琳省,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躲撰。我一直安慰自己针贬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布拢蛋。 她就那樣靜靜地躺著桦他,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谆棱。 梳的紋絲不亂的頭發(fā)上快压,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音垃瞧,去河邊找鬼蔫劣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛皆警,可吹牛的內(nèi)容都是我干的拦宣。 我是一名探鬼主播截粗,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼信姓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绸罗?” 一聲冷哼從身側(cè)響起意推,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎珊蟀,沒想到半個(gè)月后菊值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外驱,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年腻窒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昵宇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儿子,死狀恐怖瓦哎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柔逼,我是刑警寧澤蒋譬,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站愉适,受9級(jí)特大地震影響犯助,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜维咸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一剂买、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧癌蓖,春花似錦雷恃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至附井,卻和暖如春讨越,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背永毅。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工把跨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沼死。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓着逐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親意蛀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耸别,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 這篇博客主要來(lái)介紹 WebView 的相關(guān)使用方法秀姐,常見的幾個(gè)漏洞,開發(fā)中可能遇到的坑和最后解決相應(yīng)漏洞的源碼若贮,以...
    Shawn_Dut閱讀 7,236評(píng)論 3 55
  • 相關(guān)API1.1. 相關(guān)類介紹1.2. WebView1.3. WebSettings1.4. WebViewCl...
    reezy閱讀 29,539評(píng)論 16 105
  • WebView·開車指南 目錄 WebView簡(jiǎn)介 WebView基本使用 WebView常用方法 WebSett...
    小莊bb閱讀 3,513評(píng)論 3 25
  • Tips 由于WebView的用法實(shí)在太多省有,如果您只是想查詢某個(gè)功能的使用——建議Ctrl+F(Commad+F)...
    BugDev閱讀 7,749評(píng)論 11 109
  • WebView·開車指南 目錄 WebView簡(jiǎn)介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,751評(píng)論 0 19