Android(安卓)API Guides---Building Web Apps in WebView
16lz
2021-01-26
如果要提供一个Web应用程序(或只是一个网页),为客户端应用程序的一部分,可以使用web视图做到这一点。 web视图类是Android的View类的扩展,使您可以显示网页作为你的活动布局的一部分。它不包括一个充分开发的web浏览器的任何功能,如导航控件或地址栏。所有的web视图确实,在默认情况下,是显示网页。
一个常见的场景中使用的WebView是有帮助的是,当你要提供你的应用程序,您可能需要更新,如最终用户协议或用户指南信息。在你的Android应用程序,你可以创建一个包含web视图的活动,然后用它来显示的在线托管您的文档。
在web视图可帮助另一种情况是,如果你的应用程序提供的数据总是需要Internet连接来获取数据,如电子邮件用户。在这种情况下,你可能会发现它更容易在你的Android应用程序,它显示了所有用户数据的网页,而不是执行网络请求,然后分析其数据,并在Android的布局使得它打造的WebView。相反,你可以设计一个网页的Android设备量身定制的,然后在加载网页的Android应用程序实现的WebView。
本文将向您展示如何开始使用的WebView以及如何做一些额外的事情,比如手柄页面导航,并从你的网页在你的Android应用程序绑定到的JavaScript客户端代码。
添加的WebView到您的应用程序
在WebView中使用JavaScript
如果网页你计划在你的WebView加载使用JavaScript,您必须启用JavaScript,为您的WebView。一旦启用JavaScript,你还可以创建你的应用程序代码和JavaScript代码之间的接口。
启用JavaScript
JavaScript在默认情况下禁用的WebView。您可以通过连接到您的WebView的WebSettings启用它。你可以检索的getSettings()WebSettings,然后启用JavaScript的setJavaScriptEnabled()。
例如:
结合JavaScript代码到Android代码
当开发对web视图专门设计的Android应用程序的Web应用程序,你可以创建你的JavaScript代码和客户端的Android代码之间的接口。比如,你的JavaScript代码可以在你的Android代码,以显示一个对话框调用,而不是使用JavaScript的警报()函数的方法。
要绑定你的JavaScript和Android代码之间一个新的接口,调用addJavascriptInterface(),传递一个类的实例绑定到你的JavaScript和你的JavaScript可以调用访问类的接口名称。
例如,您可以在您的Android应用程序下面的类:
在这个例子中,Web应用程序接口类允许网页创建一个吐司消息,使用showToast()方法。
您可以将这个类绑定到,在与addJavascriptInterface您的WebView运行的JavaScript()和命名接口的Android。 例如:
注:绑定到你的JavaScript对象在另一个线程中运行,而不是在它构建线程。
注意:使用addJavascriptInterface()允许JavaScript来控制你的Android应用程序。这是一个非常有用的功能或危险的安全问题。当在WebView中的HTML是不可信的(例如,部分或全部HTML是由一个不知名的人或进程提供),那么攻击者可以包含HTML的执行你的客户端代码和攻击者选择的可能的任何代码。因此,你不应该使用addJavascriptInterface(),除非你写的所有出现在你的WebView的HTML和JavaScript。你也应该不允许用户导航到其他网页,是不是你自己的,你的WebView内(而不是,让用户的默认浏览器应用程序打开国外的联系,在默认情况下,用户的Web浏览器中打开所有的URL链接,所以如以下部分所述小心只有当你处理页面导航)。
处理页面导航
当用户点击从网页中的网页视图链接,默认行为是为Android推出处理的URL的应用程序。通常情况下,默认的Web浏览器中打开并加载目标网址。但是,您可以覆盖这个行为为您的WebView,所以你的链接的WebView中打开。然后,您可以允许用户向后导航,并通过该公司由您的WebView维护他们的网页历史前进。
要打开用户点击链接,只需提供您的WebView一个WebViewClient,使用setWebViewClient()。例如:
如果你想在其中点击链路负载,创建你自己的WebViewClient覆盖shouldOverrideUrlLoading()方法更多的控制。 例如:
浏览网页历史记录
当你的WebView覆盖网址加载,它会自动累计访问的网页的历史记录。您可以导航落后,通过历史与转发返回()和前进()。
例如,这里是你的活动如何使用设备后退按钮向后导航:
一个常见的场景中使用的WebView是有帮助的是,当你要提供你的应用程序,您可能需要更新,如最终用户协议或用户指南信息。在你的Android应用程序,你可以创建一个包含web视图的活动,然后用它来显示的在线托管您的文档。
在web视图可帮助另一种情况是,如果你的应用程序提供的数据总是需要Internet连接来获取数据,如电子邮件用户。在这种情况下,你可能会发现它更容易在你的Android应用程序,它显示了所有用户数据的网页,而不是执行网络请求,然后分析其数据,并在Android的布局使得它打造的WebView。相反,你可以设计一个网页的Android设备量身定制的,然后在加载网页的Android应用程序实现的WebView。
本文将向您展示如何开始使用的WebView以及如何做一些额外的事情,比如手柄页面导航,并从你的网页在你的Android应用程序绑定到的JavaScript客户端代码。
添加的WebView到您的应用程序
到的WebView添加到您的应用程序,只需在你的活动布局<web视图>元素。例如,下面是其中的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"/>以在web视图加载网页,用于使用loadURL()。 例如:
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.loadUrl("http://www.example.com");在此之前将工作,但是,你的应用程序必须能够访问互联网。为了获得互联网接入,请求在你的清单文件INTERNET权限。 例如:
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ...</manifest>这就是你需要一个显示网页的基本看法。
在WebView中使用JavaScript
如果网页你计划在你的WebView加载使用JavaScript,您必须启用JavaScript,为您的WebView。一旦启用JavaScript,你还可以创建你的应用程序代码和JavaScript代码之间的接口。
启用JavaScript
JavaScript在默认情况下禁用的WebView。您可以通过连接到您的WebView的WebSettings启用它。你可以检索的getSettings()WebSettings,然后启用JavaScript的setJavaScriptEnabled()。
例如:
WebView myWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = myWebView.getSettings();webSettings.setJavaScriptEnabled(true);WebSettings提供了访问各种其他设置,您可能会发现有用。例如,如果你正在开发一个专门针对你的Android应用程序的WebView中专门设计了一个Web应用程序,那么你可以定义setUserAgentString()的自定义用户代理字符串,然后查询自定义用户代理在您的网页,以验证客户端请求你的网页实际上是你的Android应用程序。
结合JavaScript代码到Android代码
当开发对web视图专门设计的Android应用程序的Web应用程序,你可以创建你的JavaScript代码和客户端的Android代码之间的接口。比如,你的JavaScript代码可以在你的Android代码,以显示一个对话框调用,而不是使用JavaScript的警报()函数的方法。
要绑定你的JavaScript和Android代码之间一个新的接口,调用addJavascriptInterface(),传递一个类的实例绑定到你的JavaScript和你的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(); }}注意:如果你已经设置你的targetSdkVersion到17或更高,则必须将@JavascriptInterface注释添加到您希望提供给您的JavaScript(该方法也必须是公共的)任何方法。如果你不提供批注,在Android4.2或更高版本上运行时的方法不是通过网页访问。
在这个例子中,Web应用程序接口类允许网页创建一个吐司消息,使用showToast()方法。
您可以将这个类绑定到,在与addJavascriptInterface您的WebView运行的JavaScript()和命名接口的Android。 例如:
WebView webView = (WebView) findViewById(R.id.webview);webView.addJavascriptInterface(new WebAppInterface(this), "Android");这将创建一个叫做Android在WebView中运行的JavaScript的接口。在这一点上,Web应用程序可以访问Web应用程序接口类。例如,这里的一些HTML和JavaScript创建使用新界面,当用户点击一个按钮举杯消息:
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /><script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); }</script>有没有必要从JavaScript初始化Android界面。该自动网页视图使得其提供给您的网页。于是,在点击按钮时,showAndroidToast()函数使用Android界面来调用Web应用程序Interface.showToast()方法。
注:绑定到你的JavaScript对象在另一个线程中运行,而不是在它构建线程。
注意:使用addJavascriptInterface()允许JavaScript来控制你的Android应用程序。这是一个非常有用的功能或危险的安全问题。当在WebView中的HTML是不可信的(例如,部分或全部HTML是由一个不知名的人或进程提供),那么攻击者可以包含HTML的执行你的客户端代码和攻击者选择的可能的任何代码。因此,你不应该使用addJavascriptInterface(),除非你写的所有出现在你的WebView的HTML和JavaScript。你也应该不允许用户导航到其他网页,是不是你自己的,你的WebView内(而不是,让用户的默认浏览器应用程序打开国外的联系,在默认情况下,用户的Web浏览器中打开所有的URL链接,所以如以下部分所述小心只有当你处理页面导航)。
处理页面导航
当用户点击从网页中的网页视图链接,默认行为是为Android推出处理的URL的应用程序。通常情况下,默认的Web浏览器中打开并加载目标网址。但是,您可以覆盖这个行为为您的WebView,所以你的链接的WebView中打开。然后,您可以允许用户向后导航,并通过该公司由您的WebView维护他们的网页历史前进。
要打开用户点击链接,只需提供您的WebView一个WebViewClient,使用setWebViewClient()。例如:
WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.setWebViewClient
(new WebViewClient());
现在,所有的链接用户点击加载的网页视图。
如果你想在其中点击链路负载,创建你自己的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(),它检查URL主机是否特定的域匹配(如上定义)。如果匹配,则该方法返回false为了不重写URL加载(它允许的WebView加载URL照常)。如果URL主机不匹配,那么目的是创建启动默认的活动处理的URL(其解析为用户的默认Web浏览器)。 浏览网页历史记录
当你的WebView覆盖网址加载,它会自动累计访问的网页的历史记录。您可以导航落后,通过历史与转发返回()和前进()。
例如,这里是你的活动如何使用设备后退按钮向后导航:
@Overridepublic boolean如果确实有网页历史记录用户访问的canGoBack()方法返回true。同样,你可以使用canGoForward()来检查是否有前进的历史。如果不执行此检查,那么一旦用户到达历史的终结,返回()或前进()什么都不做。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);}
更多相关文章
- Android(安卓)API Guides---Supporting Multiple Screens
- Mac下无线调试Android应用程序
- Android(安卓)API Guides---Media Router
- Windows phone开发初体验之(四)-处理Windows Phone 中的方向更改
- 提升Android应用开发性能的十大要点(1)
- Android(安卓)总结:Manifest文件中,application和activity标签属
- 关于手机网页viewpoint缩放适配各种机型各种浏览器的总结
- Android(安卓)Scroll分析(一)
- Android(安卓)API 中文 (5) —— 使用平台的样式和主题