知識點概述:javascript
1.WebView加載網頁的三種方式:loadUrl() , loadData(), LoadDataWithBaseURL()html
2.瞭解WebSettings, WebViewClient, WebChromeClient相對於WebView的做用java
3.WebView與javascript相互調用(難點)android
知識點詳述:web
1.WebView加載網頁的三種方式: loadUrl() , loadData(), LoadDataWithBaseURL()瀏覽器
loadUrl(String url) 設置當前WebView須要訪問的網址緩存
互聯網用:webView.loadUrl("http://www.baidu.com"); 網絡
注: AndroidManifest.xml中必須使用許可"android.permission.INTERNET"纔可訪問網絡ide
本地頁面放在assets目錄下用:webView.loadUrl("file:///android_asset/html/XX.html"); (注意前綴 file:///android_asset/...)佈局
本地頁面也可放在sdcard目錄下:webView.loadUrl(file:///mnt/sdcard/test/test.html"); (注意前綴 file:///mnt/sdcard/...)
loadData(String data, String mimeType, String encoding), 容易致使亂碼
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) 跟loadData相比,優先選擇
http://blog.csdn.net/u011206077/article/details/10142999
http://www.csdn123.com/html/itweb/20131016/169685.htm
data:要加載的網頁內容
mimetype:加載的網頁內容的類型(text/html,image/jpeg)
encoding: 指定編碼(utf-8, gbk)
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 設置用鼠標激活被選項
setSupportZoom 設置是否支持變焦
緩存模式分析:
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處理各類通知、請求等事件的類。能夠經過WebView的setWebViewClient方法來指定一個WebViewClient對象。WebViewClient提供了以下的一些方法,咱們能夠覆蓋這些方法來輔助WebView瀏覽網頁,代碼以下(咱們設置覆蓋shouldOverrideUrlLoading方法,使得當有新鏈接時,使用當前的WebView來顯示):
public boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
onPageFinished網頁加載完畢
onPageStarted 網頁開始加載
onReceivedError 報告錯誤信息
onScaleChanged WebView發生改變
shouldOverrideUrlLoading 控制新的鏈接在當前WebView中打開 **************************************
補充:對」Back」按鍵的處理:若是用webview點連接看了不少頁之後,若是不作任何處理,點擊系統「Back」鍵,整個webView進程會調用finish()而結束自身,若是但願瀏覽的網頁回退而不是退出瀏覽器,須要在當前Activity中處理並消費掉該Back事件。
覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。
webview.goBack(); //goBack()表示返回webView的上一頁面
WebChromeClient用來輔助WebView處理Javascript的對話框、網站圖標、網站Title、加載進度等。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(網頁/javascript)與java相互調用
WebView不但能夠運行一段HTML代碼,還有一個重要特色,就是WebView能夠同Javascript互相調用。
經過addJavascriptInterface(Object obj,String interfaceName)方法將一個Java對象綁定到一個Javascript對象中,Javascript對象名就是interfaceName,做用域是Global,這樣即可以擴展Javascript的API,獲取Android的數據。
同時,在Java代碼中也能夠直接調用Javascript方法,這樣就能夠互相調用取得數據了,代碼以下:
WebView.loadUrl("javascript:方法名()");
注意: SDK2.3 OS對js的支持有問題,不起做用
課堂小結:
一、訪問網絡,必須添加權限:AndroidManifest.xml中必須使用許可"android.permission.INTERNET",不然會出Web page not available錯誤。
二、設置WebView基本信息:
若是訪問的頁面中有Javascript,則webview必須設置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
三、設置WevView要顯示的網頁:
互聯網用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html");
Android SDK提供了一個Schema,前綴爲"file:///android_asset/".WebView遇到這樣的Schema,就去當前包中的Assets目錄中
四、若是但願點擊超連接由本身處理,而不是新開WebView進程中響應該連接。給WebView添加一個事件監聽對象(WebViewClient)
並重寫其中的一些方法
shouldOverrideUrlLoading:對網頁中超連接按鈕的響應。
當按下某個超鏈接時WebViewClient會調用這個方法,並傳遞參數:按下超連接的url
五、若是用webview點連接看了不少頁之後,若是不作任何處理,點擊系統「Back」鍵,整個瀏覽器會調用finish()而結束自身,若是但願瀏覽的網頁回退而不是退出瀏覽器,須要在當前Activity中處理並消費掉該Back事件。
覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown(int keyCoder,KeyEvent event){
if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
webview.goBack(); //goBack()表示返回webView的上一頁面
return true;
}
return false;
}