android webview 篇

標(biāo)簽: android


使用場景

如果你想發(fā)布一個web application 作為你應(yīng)用客戶端的一部分,你可以使用webview來實現(xiàn)。webview 類是android view類的擴展,它可以讓你顯示web頁面作為你Activity布局的一部分。webview不包含瀏覽器的完整特性,例如導(dǎo)航控制和地址欄。它僅僅是最基本的功能,就是展示web頁面。

當(dāng)你應(yīng)用的頁面需要及時的更新,例如給用戶提供的協(xié)議,或者用戶指南,這時使用webview作為你的應(yīng)用頁面是很合適的。在你的應(yīng)用里面,你可以創(chuàng)建一個包含webview的Activity,然后在線顯示文檔。

如何使用

  1. 添加一個webview 到你的application

    簡單的包含一個<WebView>元素到你的標(biāo)簽

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>
  1. 綁定webview,使用loadurl()
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
  1. 在它能工作之前你還必須聲明Intent權(quán)限
<manifest ... >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

以上就是最基本的webview使用,是不是很簡單呢?

在你的webview中使用javaScript

如果在你加載的web頁面中需要使用JavaScript,那么你必須讓JavaScript能夠使用,一旦javaScript可以使用,你就可以在你的應(yīng)用代碼和JavaScript之間創(chuàng)建接口。

如何啟用JavaScript
在默認(rèn)的情況下JavaScript是沒有啟用的。你可以通過連接這個webview的websetting來開啟它。你可以通過getSetting()方法獲取webseting,然后使用setJavaScriptEnable()方法來開啟它。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

當(dāng)然webSetting還提供了很多其他很有幫助的設(shè)置,具體的內(nèi)容可以參考谷歌的官方api。

使你的JavaScript代碼和android的應(yīng)用代碼綁定
當(dāng)你在開發(fā)web應(yīng)用的使用,你可能需要為你的應(yīng)用特別開發(fā)一個webview,你可以在JavaScript代碼和應(yīng)用客戶端之間創(chuàng)建接口,例如你可以創(chuàng)建JavaScript代碼調(diào)用android代碼你的方法去顯示一個dialog,而不是使用JavaScript的alert()的功能。
想要將JavaScript代碼和android代碼綁定,可以使用addJavasriptInterface()方法,通過這個類的實例就可以將JavaScript和接口名綁定,然后JavaScript就可以調(diào)用這個類的方法。

/***
*這是JavaScript與android代碼綁定的實現(xiàn)類
*/
public class AppJavascriptInterface {
    Context mContext;

    /**初始化接口,設(shè)置上下文 */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /**從web頁面中顯示一個toast*/
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

注意:如果你的targetSdkVersion大于17的話,你必須在任何JavaScript可以獲取的方法前加上@JavascriptInterface注解,而且這個方法的訪問權(quán)限必須是public的。如果你不加注解,可能在高于android4.2的手機中將無法獲取到接口方法。

上面的AppJavascriptInterface類為web頁面創(chuàng)建了一個彈出Toast的方法。將這個類的實例綁定到運行的webview上

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new AppJavascriptInterface(this), "Android");

在webview的javaScript低嗎中可以調(diào)用android來調(diào)用接口里的方法。

<input type="button" value="你好" onClick="showAndroidToast('你好')" />

<script type="text/javascript">
    function showAndroidToast(msg) {
        Android.showToast(msg);
    }
</script>

這里我們不需要在JavaScript中初始化android接口,webview會自動進行。

注意:使用這種方式是一把雙刃劍,在極大方便了我們的同時,也不可避免的帶來了很多安全問題,應(yīng)以web頁面的內(nèi)容通常來自于外部,是未知的,當(dāng)JavaScript代碼可以調(diào)用android內(nèi)部代碼的時候,危險也就可能出現(xiàn),所以我們應(yīng)當(dāng)盡可能的避免這種情況,除非必須使用這種特性。同時我們也應(yīng)該不讓用戶導(dǎo)航到不是我們自己的頁面,當(dāng)超出頁面范圍的時候,可以使用外部的瀏覽器來時實現(xiàn),而不是我們內(nèi)置的webview。

處理頁面導(dǎo)航

當(dāng)用用戶點擊webview中的一個連接的時候,android系統(tǒng)默認(rèn)的處理方式時啟動一個新的應(yīng)用來處理這個連接。默認(rèn)情況下,android是打開一個瀏覽器來加載URL,然而你可以重寫webview這種行為方式,這樣連接就可以用內(nèi)置的webview打開,同時還能在你webview中的歷史記錄經(jīng)行前進和后退導(dǎo)航。

打開用戶點擊的連接,可以提供一個為你的webview提供一個webviewClient

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());

如果你想更多的控制連接加載,你可以創(chuàng)建自己的客戶端重寫shouldOverriderUrlLoad()的方法

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    //如果這是我們自己的站點域名不需要重寫
        if (Uri.parse(url).getHost().equals("www.example.com")) {
            return false;
        }
        // 不是自己的站點,啟動另一個應(yīng)用
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

創(chuàng)建這個類的實例

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

導(dǎo)航歷史記錄界面
當(dāng)你的webview覆寫URL加載時他將自動累計URL訪問的歷史記錄頁面你可以通過goBack()goForward()方法。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // 當(dāng)返回動作執(zhí)行的時候,監(jiān)聽是否有可返回的歷史記錄
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
   //沒有歷史記錄頁面返回,屬于系統(tǒng)正常退出
    return super.onKeyDown(keyCode, event);
}

如果有歷史記錄存在,則canGoBack()方法返回true,同樣canGoForward()也是如此,一旦用戶到達了歷史記錄的末尾,再次調(diào)用goBack()或者goForward(),它將什么事也不做。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容