Android WebView基本介紹

大部份內容爲網上整理其它高人的帖子,現只做整理,用於查看:javascript

在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內核)。
 

這裏咱們初步體驗一下在android是使用webview瀏覽網頁,在SDK的Dev Guide中有一個WebView的簡單例子 。
 

在開發過程當中應該注意幾點:
 
    1.AndroidManifest.xml中必須使用許可"android.permission.INTERNET",不然會出Web page not available錯誤。
    2.若是訪問的頁面中有Javascript,則webview必須設置支持Javascript。
        webview.getSettings().setJavaScriptEnabled(true);  
    3.若是頁面中連接,若是但願點擊連接繼續在當前browser中響應,而不是新開Android的系統browser中響應該連接,必須覆蓋 webview的WebViewClient對象。
html

 

  1. mWebView.setWebViewClient(new WebViewClient(){       
  2.                     public boolean shouldOverrideUrlLoading(WebView view, String url) {       
  3.                         view.loadUrl(url);       
  4.                         return true;       
  5.                     }       
  6.         });   

 

 

 4.若是不作任何處理,瀏覽網頁,點擊系統「Back」鍵,整個Browser會調用finish()而結束自身,若是但願瀏覽的網 頁回退而不是推出瀏覽器,須要在當前Activity中處理並消費掉該Back事件。java

 

  1. public boolean onKeyDown(int keyCode, KeyEvent event) {       
  2.         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
  3.             mWebView.goBack();       
  4.                    return true;       
  5.         }       
  6.         return super.onKeyDown(keyCode, event);       
  7.     }     

 

 

下一步讓咱們來了解一下android中webview是如何支持javascripte自定義對象的,在w3c標準中js有 window,history,document等標準對象,一樣咱們能夠在開發瀏覽器時本身定義咱們的對象調用手機系統功能來處理,這樣使用js就能夠 隨心所欲了。android

  看一個實例:web

 

  1. public class WebViewDemo extends Activity {        
  2.     private WebView mWebView;       
  3.     private Handler mHandler = new Handler();       
  4.        
  5.     public void onCreate(Bundle icicle) {       
  6.         super.onCreate(icicle);       
  7.         setContentView(R.layout.webviewdemo);       
  8.         mWebView = (WebView) findViewById(R.id.webview);       
  9.         WebSettings webSettings = mWebView.getSettings();       
  10.         webSettings.setJavaScriptEnabled(true);       
  11.         mWebView.addJavascriptInterface(new Object() {       
  12.             public void clickOnAndroid() {       
  13.                 mHandler.post(new Runnable() {       
  14.                     public void run() {       
  15.                         mWebView.loadUrl("javascript:wave()");       
  16.                     }       
  17.                 });       
  18.             }       
  19.         }, "demo");       
  20.         mWebView.loadUrl("file:///android_asset/demo.html");       
  21.     }       
  22. }   

 

 

咱們看addJavascriptInterface(Object obj,String interfaceName)這個方法,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是 interfaceName(demo),做用域是Global。這樣初始化webview後,在webview加載的頁面中就能夠直接經過 javascript:window.demo訪問到綁定的java對象了。來看看在html中是怎樣調用的。瀏覽器

 

  1. <html>       
  2.         <mce:script language="javascript"><!--     
  3.        
  4.                 function wave() {       
  5.                     document.getElementById("droid").src="android_waving.png";       
  6.                 }       
  7.              
  8. // --></mce:script>       
  9.         <body>       
  10.             <a onClick="window.demo.clickOnAndroid()">       
  11.                                 <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>       
  12.                                 Click me!       
  13.             </a>       
  14.         </body>       
  15. </html>      

 

 

這樣在javascript中就能夠調用java對象的clickOnAndroid()方法了,一樣咱們能夠在此對象中定義不少方法(比 如發短信,調用聯繫人列表等手機系統功能。),這裏wave()方法是java中調用javascript的例子。框架

這裏還有幾個知識點: 

1)爲了讓WebView從apk文件中加載assets,Android SDK提供了一個schema,前綴爲"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的 assets目錄中找內容。如上面的"file:///android_asset/demo.html"
 
2)addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用 Handler的目的。
ide

相關文章
相關標籤/搜索