android WebView開發總結

再此之前曾經轉載過一遍文章,詳見:webview總結。最近有時間又重新研究了一下webview,做一下總結。

在Android手機中內置了一款高性能webkit內核瀏覽器,在SDK中封裝爲一個叫做WebView組件。 
什麼是webkit
 
WebKit是Mac OS X v10.3及以上版本所包含的軟件框架(對v10.2.7及以上版本也可通過軟件更新獲取)。 同時,WebKit也是Mac OS X的Safari網頁瀏覽器的基礎。WebKit是一個開源項目,主要由KDE的KHTML修改而來並且包含了一些來自蘋果公司的一些組件。
 

傳統上,WebKit包含一個網頁引擎WebCore和一個腳本引擎JavaScriptCore,它們分別對應的是KDE的KHTML和KJS。不過, 隨着JavaScript引擎的獨立性越來越強,現在WebKit和WebCore已經基本上混用不分(例如Google Chrome和Maxthon 3採用V8引擎,卻仍然宣稱自己是WebKit內核)。

1.WebView加載網頁的三種方式:loadUrl,loadData,loadDataWithBaseURL

  loadUrl(String url) 設置當前WebView需要訪問的網址

互聯網用:webView.loadUrl("http://www.baidu.com"); 

注: AndroidManifest.xml中必須使用許可"android.permission.INTERNET"纔可訪問網絡

      本地頁面放在assets目錄下用:webView.loadUrl("file:///android_asset/html/XX.html"); 

      本地頁面也可放在sdcard目錄下:webView.loadUrl(file:///mnt/sdcard/test/test.html");

      loadData(String data, String mimeType, String encoding),   容易導致亂碼, 優先選擇 

        loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) 


二者區別參看文章:

http://blog.csdn.net/u011206077/article/details/10142999

http://www.csdn123.com/html/itweb/20131016/169685.htm

2.瞭解WebSettings, WebViewClient, WebChromClient相對於WebView的功能

WebSettings用來設置WebView的一些屬性、狀態等。在創建WebView時,系統有一個默認的設置,我們可以通過WebView.getSettings來得到這個設置:

WebSettings webSettings=mWebView.getSettings();

WebSettings和WebView都在同一個生命週期中存在,當WebView被銷燬後,如果再使用WebSettings則會拋出IllegalStateException異常。

下面是設置WebSettings一些常用屬性、狀態的方法:

 setAllowFileAccess   啓用或禁止WebView訪問文件數據

 setBlockNetworkImage  是否顯示網絡圖像

 setBuiltInZoomControls   設置是否支持縮放

 setCacheMode             設置緩存的模式   http://blog.csdn.net/t12x3456/article/details/13745553

 setDefaultFontSize       設置默認的字體大小

 setDefaultTextEncodingName  設置在解碼時使用的默認編碼

 setFixedFontFamily     設置固定使用的字體

 setJavaScriptEnabled   設置是否支持Javascript

 setLayoutAlgorithm  設置內容佈局

 setLightTouchEnabled   設置用鼠標激活被選項

 setPluginsEnabled      支持插件

 setUseWideViewPort   調整圖片大小適應webview的大小


緩存模式分析:

LOAD_CACHE_ONLY:  不使用網絡,只讀取本地緩存數據

LOAD_DEFAULT:  根據cache-control決定是否從網絡上取數據。

LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE: 不使用緩存,只從網絡獲取數據.

LOAD_CACHE_ELSE_NETWORK
如:www.taobao.com的cache-control爲no-cache,在模式LOAD_DEFAULT下,無論如何都會從網絡上取數據,如果沒有網絡,就會出現錯誤頁面;在LOAD_CACHE_ELSE_NETWORK模式下,無論是否有網絡,只要本地有緩存,都使用緩存。本地沒有緩存時才從網絡上獲取。
www.360.com.cn的cache-control爲max-age=60,在兩種模式下都使用本地緩存數據。

總結:根據以上兩種模式,建議緩存策略爲,判斷是否有網絡,有的話,使用LOAD_DEFAULT,無網絡時,使用LOAD_CACHE_ELSE_NETWORK。

WebViewClient就是專門輔助WebView處理各種通知、請求等事件的類。比如表單的錯誤提交需要重新提交、頁面開始加載及加載完成、資源加載中、接收到http認證需要處理、頁面鍵盤響應、頁面中的url打開處理等等。可以通過WebView的setWebViewClient方法來指定一個WebViewClient對象。WebViewClient提供瞭如下的一些方法,我們可以覆蓋這些方法來輔助WebView瀏覽網頁,代碼如下(我們設置覆蓋shouldOverrideUrlLoading方法,使得當有新連接時,使用當前的WebView來顯示):

 public boolean shouldOverrideUrlLoading(WebView view,String url){

 view.loadUrl(url);

 return true;

 }

 onPageFinished          網頁加載完畢時調用,但此時渲染圖片有可能沒有加載完成。

 onLoadResource         加載資源時被調用

 onPageStarted            網頁開始加載

 onReceivedError          報告錯誤信息

 onScaleChanged          WebView發生改變

 shouldOverrideUrlLoading 控制新的連接在當前WebView中打開 

WebChromeClient用來輔助WebView處理Javascript的對話框、網站圖標、網站Title、加載進度、關閉和隱藏、頁面加載進展、警告框、js加載前、js操作超時、webView獲得焦點等等,WebChromeClient中的方法不是很多,其功能如下所示:

下面實現onReceivedTitle方法,用於更改應用程序的Title,代碼如下:

 public void onReceivedTitle(WebView view,String title){

 Activity01.this.setTitle(title);

 super.onReceivedTitle(view,title);

    }

 onJsAlert              處理Javascript中的Alert對話框

 onJsConfirm處理Javascript中的Confirm對話框

 onJsPrompt           處理Javascript中的Prompt對話框

 onProgressChanged    加載進度條改變

 onReceivedIcon       網頁圖標更改

 onReceivedTitle      網頁Title更改

3.WebView的緩存處理

文章參考:http://my.oschina.net/mycbb/blog/330422

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章