Building Web Apps in WebView

来源:互联网 发布:迅雷你的网络未连接 编辑:程序博客网 时间:2024/06/01 07:33

    如果你想要把一个网络应用(或者仅仅是一个网页)作为客户端应用的一部分,你可以使用WebView实现它。WebView类继承自View类,它允许你把网页作为应用程序布局的一部分。它不需要包含一个完整浏览器的任何功能(如导航控制或地址栏)。在默认情况下,WebView所做的一切只是显示一个网页。


    需要使用到WebView的一个情况是,你想要在程序中提供你可能要更新的信息,如最终用户协议或用户指南等。你可以在程序中创建一个包含WebView 的Activity,然后使用它显示在线文档。

    另一种需要使用到WebView的情况是,程序向用户提供那些需要频繁访问网络链接的数据,例如邮件。在这种情况下,你会发现,与起执行网络请求,然后解释数据,再把数据展示出来相比,在程序中建一个WebView并把用户数据放到网页中展示会更容易些。你可以为Android设备量身定制一个网页,然后在程序中实现WebView并加载这个网页。

   

    本文档将为你展示如何建立一个WebView以及如何做一些其他的事情,例如处理网页导航和把网页的JavaScript绑定到客户端的代码。

Adding a WebView to Your Application

    只需要在布局中包含<WebView>元素,就可以在程序中加入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"/>
    你可以调用loadUrl()方法把网页加载到WebView中
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.loadUrl("http://www.example.com");
    但是,在这之前,你必须在manifest文件中请求网络权限
<manifest ... >    <uses-permission android:name="android.permission.INTERNET" />    ...</manifest>
    这就是一个可以显示网页的WebView所需要的全部工作。

Using JavaScript in WebView

    你想在WebView中加载的网页如果使用了JavaScript,你必须为你的WebView激活JavaScript。一定JavaScript可用,你可以在程序代码和JavaScript代码之间创建一个接口。

Enabling JavaScript

在默认情况下,WebView是不激活JavaScript的。你可以通过WebView的WebSettings激活它。调用getSettings()取得WebSettings,然后调用setJavaScriptEnabled()。
WebView myWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = myWebView.getSettings();webSettings.setJavaScriptEnabled(true);
    WebSettings还提供了你可能会用到的多种其他设置。例如,如果你为正在开发的网络应用专门设计了WebView,你可以调用SetUserAgentString()定义一个自定义的用户代理字符串,然后你可以在你的网页中查询该字符串,以验证正在请求网页的客户端是不是你开发的那个网络应用。

Binding JavaScript code to Android code

当你在开发一个专门设计了WebView的网络应用时,你可以在JavaScript代码和客户端代码之间创建一个接口。例如,你的JavaScript代码可以调用你的Android代码中的方法显示一个对话框,而不是用JavaScript的alert()函数。你可以调用addJavaScriptInterface()在JavaScript和Android代码间绑定接口,它要求两个参数,一个是接口类的实例,另一个是JavaScript访问接口时用到的接口名。
例如,你可以在Android中包含以下类:
public class WebAppInterface {    Context mContext;    /** Instantiate the interface and set the context */    WebAppInterface(Context c) {        mContext = c;    }    /** Show a toast from the web page */    @JavascriptInterface    public void showToast(String toast) {        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();    }}
Caution:如果你的targetSdkVersion是17或以上,你必须在那些允许JavaScript调用的方法前加上@JavaScriptInterface注解(而且这些方法必须public的)。如果没有这个注解,运行在Android 4.2或以上版本的程序中的网页将不能访问接口中的方法。

在这个例子中,WebAppInterface类允许网页通过showToast()方法创建一个Toast。

你可以调用addJavaScriptInterface()方法把接口绑定到运行在你的WebView上的JavaScript,并把接口命名为Android,示例如下:
WebView webView = (WebView) findViewById(R.id.webview);webView.addJavascriptInterface(new WebAppInterface(this), "Android");
这就为运行在WebView上的JavaScript创建了一个名为Android的接口。此时,你的网络应用程序就可以访问WebAppInterFace类了。例如,下面有些HTML和JavaScript代码,当用户点击button时,代码使用接口创建了一个Toast。
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /><script type="text/javascript">    function showAndroidToast(toast) {        Android.showToast(toast);    }</script>
    JavaScript不需要初始化名为Android的接口。WebView会自动处理好的。所以,当点击button,showAndroidToast()方法会使用名为Android的接口调用WebAppInterface.showToast()方法。
Note:封装在JavaScript中的对象运行在其他线程中,而不是运行在创建它的线程。
Caution:使用addJavaScriptInterface()方法运行JavaScript控制你的Android程序。这是一个非常有用的功能,但也是一个危险的安全问题。当在WebView中的HTML是不可信任的(例如,部分或所有的HTML都是由不知名的人或程序提供的),然后攻击者可以写一个HTML来执行你的用户端代码,还有可能是攻击者选择的任意代码。同样的,你不应该调用addJavaScriptInterface()方法,除非所有出现在WebView中的HTML和JavaScript代码都是你自己写的。同时,你不应该允许用户在你的WebView中导航到其他网站(相反的,你应该允许用户默认的浏览器打开外部链接,在默认情况下,用户的浏览器会打开所有的URL链接,所以只有在你手动处理下节描述的网站导航时,你才需要关心这些事情)。

Handling Page Navigation

当用户点击WebView上页面的链接时,Android的默认行为是启动一个可以处理URLs的应用程序。通常情况下,默认的浏览器会打开和加载目标URL。然而,你可以为你WebView覆盖这种行为,然后就可以在WebView中打开链接。然后,你就可以允许用户根据WebView维护的浏览历史向前或向后导航。

为了打开用户点击的链接,你可以调用setWebViewClient()方法为你的WebView提供一个WebViewClient。示例如下:
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.setWebViewClient(new WebViewClient());
就是这样。现在WebView可以加载用户点击的链接了。

如果你想要更多的控制链接的加载,你可以创建自己的WebViewClient并覆盖其中的shouldOverrideUrlLoading()方法,示例如下
private class MyWebViewClient extends WebViewClient {    @Override    public boolean shouldOverrideUrlLoading(WebView view, String url) {        if (Uri.parse(url).getHost().equals("www.example.com")) {            // This is my web site, so do not override; let my WebView load the page            return false;        }        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));        startActivity(intent);        return true;    }}
然后为WebView创建一个新的WebViewClient实例
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.setWebViewClient(new MyWebViewClient());
现在,用户点击链接时,系统会调用shouldOverrideUrlLoading()方法。
当你的WebView覆盖了URL加载(如上节所示),它就会自动的记录浏览历史。你可以根据历史记录调用goBack()和goForward()向后或向前导航。
示例如下,你可以使用设备的后退键向后导航:
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    // Check if the key event was the Back button and if there's history    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {        myWebView.goBack();        return true;    }    // If it wasn't the Back key or there's no web page history, bubble up to the default    // system behavior (probably exit the activity)    return super.onKeyDown(keyCode, event);}
如果历史记录中确实有网页可以让用户浏览的话,canGoBack()方法返回true。同样的,你也可以使用canGoForward()方法检查是否能向前导航。如果你没有做这样的检查,当用户到达历史记录的尽头时,goBack()方法或goForward()方法不会干任何事情。
0 0
原创粉丝点击