Android深入理解WebView——上,androidwebview

來源:互聯網
上載者:User

Android深入理解WebView——上,androidwebview
摘要

作為Android開發人員,我們都知道在手機中內建了一款高效能 webkit 核心瀏覽器,在 SDK 中封裝為一個叫做 WebView 組件。今天就為大家講講Android中WebView的詳細使用方法        
本文原創,轉載請註明地址:http://blog.kymjs.com/

作為Android開發人員,我們都知道在手機中內建了一款高效能 webkit 核心瀏覽器,在 SDK 中封裝為一個叫做 WebView 組件。
在開發過程中應該注意幾點:
1.這是最基本的 AndroidManifest.xml 中必須添加訪問網路許可權。
2.如果訪問的頁面中有 Javascript,則 WebView 必須設定支援 Javascript。

WebView.getSettings().setJavaScriptEnabled(true);

3.如果頁面中連結,如果希望點選連結繼續在當前browser中響應,而不是新開Android的系統browser中響應該連結,必須覆蓋 WebView的WebViewClient對象.

mWebView.setWebViewClient(new WebViewClient(){public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url);return true;}});

4.如果不做任何處理 ,瀏覽網頁,點擊系統“Back”鍵,整個 Browser 會調用 finish()而結束自身,如果希望瀏覽的網頁回退而不是推出瀏覽器,需要在當前Activity中處理並消費掉該 Back 事件.(代碼有些精簡)

public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack();return true;}return super.onKeyDown(keyCode, event);}
與js互調

既然可以顯示網頁,那麼當然也可以讓網頁操作本地方法。(由於一行寫不下,縮排我調整了一下)

public class WebViewDemo extends Activity { private WebView mWebView;private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { setContentView(R.layout.WebViewdemo);mWebView = (WebView) findViewById(R.id.WebView); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() {  public void clickOnAndroid() {  mHandler.post(new Runnable() {  public void run() {   mWebView.loadUrl("javascript:wave()");  }  });  }}, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); }}

我們看 addJavascriptInterface(Object obj,String interfaceName)這個方法 ,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是 interfaceName(demo),範圍是Global.這樣初始化 WebView 後,在WebView載入的頁面中就可以直接通過javascript:window.demo訪問到綁定的java對象了. 來看看在html中是怎樣調用的.

<html><script language="javascript">  function wave() {    document.getElementById("droid").src="android_waving.png";  }</script><body>  <a onClick="window.demo.clickOnAndroid()">  <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a></body></html>

這樣在 javascript 中就可以調用 java 對象的 clickOnAndroid()方法了,同樣我們可以在此對象中定義很多方法(比如發簡訊,調用連絡人清單等手機系統功能),這裡 wave()方法是 java 中調用 javascript 的例子.

需要說明一點:addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用 Handler 的目的.

深入使用WebView讓js調用Android代碼
  1. 首先簡述 WebView、WebViewClient、WebChromeClient 之間的區別:
    在 WebView 的設計中,不是什麼事都要 WebView類乾的,有些雜事是分給其他人的,這樣 WebView 專心幹好 自己的解析、渲染工作就行了.WebViewClient 就是協助 WebView 處理各種通知、請求事件等 ,WebChromeClient 是輔助 WebView 處理 Javascript 的對話方塊,網站表徵圖,網站 title.

  2. 功能實現:
    利用 android 中的 WebView 載入一個 html 網頁,在 html 網頁中定義一個按鈕,點擊按鈕彈出一 個 toast.

  3. 實現步驟:
    首先定義一個介面類,將內容物件傳進去,在介面類中定義要在 js 中實現的方法。
    接著在assets資源套件下定義一個 html 檔案,在檔案中定義一個 button.button 的點擊事件定義為一個 js 函數.
    之後在 xml 中定義一個 WebView 組件,在活動類中擷取 WebView 並對 WebView 參數進行設定,此處特別注意要設定 WebView 支援 js 且將定義的 js 介面類添加到 WebView 中去,此後在 js 中就可以利用該介面類中定義的 函數了.即:

    myWebView.getSettings().setJavaScriptEnabled(true);

    myWebView.addJavascriptInterface(new JavaScriptinterface(this),”android”);

最後利用 WebView 載入本地 html 檔案的方法是:

myWebView.loadData(htmlText,"text/html", "utf-8");

此處的htmltext 是以字串的方式讀取 assets 報下 html中的內容.
4. 實現利用返回鍵返回到上一頁:
設定 WebView 的按鍵監聽,監聽到期返回鍵並判斷網頁是否能夠返回 ,利用 WebView 的 goBack()返回到上一頁.

WebView 緩衝

在項目中如果使用到 WebView 控制項,當載入 html 頁面時,會在/data/data/包名目錄下產生 database 與 cache 兩個檔案夾(My Phone沒有root,就不了)。
請求的 url 記錄是儲存在 WebViewCache.db,而 url 的內容是儲存在 WebViewCache 檔案夾下. 大家可以自己動手試一下,定義一個html檔案,在裡面顯示一張圖片,用WebView載入出來,然後再試著從緩衝裡把這張圖片讀取出來並顯示 .

WebView 刪除緩衝

其實已經知道緩衝儲存的位置了,那麼刪除就很簡單了,擷取到這個緩衝,然後刪掉他就好了。
//刪除儲存於手機上的緩衝

private int clearCacheFolder(File dir,long numDays) {   int deletedFiles = 0;  if (dir!= null && dir.isDirectory()){    try {      for (File child:dir.listFiles()){      if (child.isDirectory()) {        deletedFiles += clearCacheFolder(child, numDays);        }        if (child.lastModified() < numDays) {          if (child.delete()) {           deletedFiles++;           }        }      }    } catch(Exception e) {      e.printStackTrace();     }  }  return deletedFiles; }

是否啟用緩衝功能也是可以控制的

//優先使用緩衝: WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //不使用緩衝: WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

在退出應用的時候加上如下代碼,可以完整的清空緩衝

File file = CacheManager.getCacheFileBaseDir();if (file != null && file.exists() && file.isDirectory()) {    for (File item : file.listFiles()) {        item.delete();}file.delete();    }context.deleteDatabase("WebView.db"); context.deleteDatabase("WebViewCache.db");
WebView 處理 404 錯誤

顯示網頁還會遇到一個問題,就是網頁有可能會找不到,WebView當然也是可以處理的(代碼如果全部貼出來實在太多了,這裡就只貼重要部分了)

public class WebViewActivity extends Activity {    private Handler handler = new Handler() {        public void handleMessage(Message msg) {              if(msg.what==404) {//首頁不存在                  //載入本地 assets 檔案夾下面的錯誤提示頁面 404.html                  web.loadUrl("file:///android_asset/404.html");                    }else{                          web.loadUrl(HOMEPAGE);                    }              }};      @Override      protected void onCreate(Bundle savedInstanceState) {        web.setWebViewClient(new WebViewClient() {              public boolean shouldOverrideUrl(WebView view,String url) {     if(url.startsWith("http://") && getRespStatus(url)==404) {              view.stopLoading();              //載入本地 assets 檔案夾下面的錯誤提示頁面 404.html               view.loadUrl("file:///android_asset/404.html");        }else{              view.loadUrl(url);        }      return true;    }      });      new Thread(new Runnable() {            public void run() {          Message msg = new Message();          //此處判斷首頁是否存在,因為首頁是通過 loadUrl 載入的,          //此時不會執行 shouldOverrideUrlLoading 進行頁面是否存在的判斷         //進入首頁後,點首頁裡面的連結,連結到其他頁面就一定會執行shouldOverrideUrlLoading 方法了             if(getRespStatus(HOMEPAGE)==404) {                      msg.what = 404;              }              handler.sendMessage(msg);          }).start();      }}
未完

由於WebView的用法實在太多了,這裡就分為兩部分,下一部分跟大家講講WebView滾動狀態監聽以及擷取session與寫cookie的方法~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.