標簽: android
使用場景
如果你想發布一個web application 作為你應用客戶端的一部分,你可以使用webview來實現。webview 類是android view類的擴展,它可以讓你顯示web頁面作為你Activity布局的一部分。webview不包含瀏覽器的完整特性,例如導航控制和地址欄。它僅僅是最基本的功能,就是展示web頁面。
當你應用的頁面需要及時的更新,例如給用戶提供的協議,或者用戶指南,這時使用webview作為你的應用頁面是很合適的。在你的應用里面,你可以創建一個包含webview的Activity,然后在線顯示文檔。
如何使用
- 添加一個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"
/>
- 綁定webview,使用
loadurl()
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
- 在它能工作之前你還必須聲明
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()
,它將什么事也不做。