天天看點

Android-----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核心)。 

這裡我們初步體驗一下在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對象。

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 == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       

            mWebView.goBack();       

                   return true;       

        }       

        return super.onKeyDown(keyCode, event);       

    }     

下一步讓我們來了解一下android中webview是如何支援javascripte自定義對象的,在w3c标準中js有 window,history,document等标準對象,同樣我們可以在開發浏覽器時自己定義我們的對象調用手機系統功能來處理,這樣使用js就可以 為所欲為了。

  看一個執行個體:

public class WebViewDemo extends Activity {        

    private WebView mWebView;       

    private Handler mHandler = new Handler();       

    public void onCreate(Bundle icicle) {       

        super.onCreate(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>       

        <mce:script language="javascript"><!--     

                function wave() {       

                    document.getElementById("droid").src="android_waving.png";       

                }       

// --></mce: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的例子。

這裡還有幾個知識點: 

1)為了讓WebView從apk檔案中加載assets,Android SDK提供了一個schema,字首為"file:///android_asset/"。WebView遇到這樣的schema,就去目前包中的 assets目錄中找内容。如上面的"file:///android_asset/demo.html" 

2)addJavascriptInterface方法中要綁定的Java對象及方法要運作另外的線程中,不能運作在構造他的線程中,這也是使用 Handler的目的。

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/1230814,如需轉載請自行聯系原作者