android webview 篇

標簽: android


使用場景

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

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

如何使用

  1. 添加一個webview 到你的application

    簡單的包含一個<WebView>元素到你的標簽

<?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權限
<manifest ... >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

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

在你的webview中使用javaScript

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

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

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

當然webSetting還提供了很多其他很有幫助的設置,具體的內容可以參考谷歌的官方api。

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

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

    /**初始化接口,設置上下文 */
    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注解,而且這個方法的訪問權限必須是public的。如果你不加注解,可能在高于android4.2的手機中將無法獲取到接口方法。

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

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

在webview的javaScript低嗎中可以調用android來調用接口里的方法。

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

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

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

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

處理頁面導航

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

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

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

如果你想更多的控制連接加載,你可以創建自己的客戶端重寫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;
        }
        // 不是自己的站點,啟動另一個應用
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

創建這個類的實例

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

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容