再此之前曾經轉載過一遍文章,詳見: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的緩存處理