android API Guides 之 web app --------------Building Web Apps in WebView(WebView与页面的绑定)

本文详细介绍了如何在Android应用中使用WebView控件加载网页,并提供了加载页面的基本方法、如何启用JavaScript、在JavaScript和客户端代码之间创建接口、处理页面跳转和浏览历史网页的实现方式。

 博客为 有时个哥 原创,如需转载请标明出处:http://blog.youkuaiyun.com/ls703/article/details/45581923

 

如果你要在手机端实现一个web app或在app里加载一个web页面,那么你就要用到WebView控件。这WebView类是View类的扩展子类,它允许web页面作为应用布局的一部分来展示。它是不具备一个完整的浏览器的那些特性,例如WebView没有导航栏,地址栏等。WebView的默认功能就是去加载Web页面。

当你在你的app里面加一些以后可能跟新的信息时(例如用户协议或用户指南),你使用WebView那是非常有帮助的。在你的应用里,你可以创建一个带有WebView的activity,然后展示的你的在线文档信息。

使用WebView比较适合的另一种情况是,当你给用户提供数据的时候总是需要连接服务器去检索数据,例如邮件。你会发现使用webView 在应用里去使用网页展示用户数据相对于每次都去请求网络然后在解析数据然后展示在layout里面更容易简单一些。你可以针对Android设备设计web页面然后在你的Android应用里使用WebView加载它们。

这片文章是展示了如何去开始使用WebView和用它做一些额外的事情。例如在你的Android应用里去处理页面导航和把你页面中的js绑定到客户端代码中。

 

Adding a WebView to Your Application

在你layout布局中添加<WebView>就可以把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 myWebView = (WebView) findViewById(R.id.webview);
 myWebView.loadUrl("http://www.example.com");

要注意,你必须在manifest file里设置INTERNET权限,它才能使用。

<manifest ... >     
<uses-permission android:name="android.permission.INTERNET" />     
... 
</manifest>


这是WebView去展示页面所需要的最基本的几个方面。

Using JavaScript in WebView(在WebView中使用js)

 如果你WebView里面加载的页面要使用js,那你需要在你的WebView里面启用js。一旦你启用了js,你还可以在你的应用代码和js代码之间穿件接口。

Enabling JavaScript

在WebView中js默认的是无法使用的,你可应通过WebSettings去设置你的WebView,使它能够使用js。你可以通过使用WebView的getSettings()方法得到WebSettings的返回值,然后调用WebSettingssetJavaScriptEnabled()方法来设置使用js。

例如

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

WebSettings提供各种各样的你认为有用的设置权限。如果你在你的应用中使用WebView去开发设计一个Web app,你可以通过使用setUserAgentString()去设置一个用户代理字符串,然后在你的web页面查询这个用户代理头验证这个这个页面请求确实是你的app应用。

来自Android SDK工具/目录中

Binding JavaScript code to Android code

当你在你的app应用里使用WebView开发web应用,你能够在js代码和客户端代码之间去创建接口。例如,js代码去调用你的Android里面的一个方法,去弹出弹框来去替代使用js的alter。

通过调用addJavascriptInterface()方法,可以在js代码和Android代码之间绑定一个接口,它可以把一个实例绑定到js,js可以通过这个接口的名字去调用这可实例。

例如下面:

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();     
	}
 }

警告:如果你sdk的版本是17或者是更高,你必须在你想在js中调用的任何方法前添加@JavascriptInterface 注释(这方法必须是public的)。如果你没有提供这个注解,那么这方法就会在4.2或是更高版本上无法运行。

这个实例是WebAppInterface类允许WebView页面用showToast方法去穿件一个Toast信息。,你能用WebView的addJavascriptInterface()把这个类绑定带你的js里,并且这个接口的名字是"Android".例如:

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


运行在WebView里的js通过“Android”去调用这个创建的接口,这时,你的web app就可以访问WebAppInterface类。例如,这里是一些html代码,当通过点击按钮,js调用这new interface接口去创建Toast。

 
 <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />  
 <script type="text/javascript">     
	 unction showAndroidToast(toast) {         
		Android.showToast(toast);     
	 } 
 </script>

你不需要在js中初始化这“Android”接口。WebView会自动的使它能够在web页面里使用。因此,点击这个按钮,这个showAndroidToast()将会使用Android 这个接口去调用WebAppInterface.showToast()方法。

注意:这个对象是被绑定在js上运行在另一个线程里,不是在他被创建的线程里。

 

警告:

使用这个addJavascriptInterface()方法之后,js就被允许控制你的Android应用。这即使非常有用的特性,又可能是非常危险的特性。在webview里,html是靠不住的(例如,html的部分或是全部可能是通过一个不认识的人或程序被提供)。攻击这可在你html里执行你客户端的代码和选择任何代码。如果这样的话,你就不能去使用addJavascriptInterface(),除非你WebView的html和js全是你自己写的。你应该禁止用户在WebView里去跳转到不是自己页面的第三方其他页面。(去代替这些,默认的用户的浏览器可以打开所有的url链接,因此如果你处理页面跳转,如果有下面所描述的情况,你就应该格外去小心注意)。

Handling Page Navigation(处理页面跳转)

 

当用户从你webview里点击一个链接,默认的是去加载一个去处理url的应用,通常是默认的浏览器去打开并加载这个url。然而,你能在webview里去覆盖这以默认行为,让url在你自己的webview里面打开。然后你可以用户向后或向前跳转,通过webview维护的web页面的访问记录。

setWebViewClient().方法提供一个WebViewClient,让用户在自己的webView里面打开链接。

例子:

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


 

这样做之后,所有的url都会在你的WebView里面打开了。

如果点击链接,你想做其他更多色事的话,你就需要去重写WebViewClientshouldOverrideUrlLoading()

实例:

	 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的host是不是匹配特定的域名(如上面)。如果不匹配这个方法就会返回false,为了不覆盖url加载,如果url的不匹配,就会跳转能默认加载这个URL的activity。

 

Navigating web page history(浏览历史网页)

 

 

当你的WebView复写了url加载,他就会自己记录访问的历史页面。你能用goBack() 和goForward().方法,通过这个历史记录向前或向后跳转。

例如,这里是一个点击后退按钮回退网页的操作。

@Override 
 public 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()不会做任何操作。

 


 

 

 

**项目概述:** 本资源提供了一套采用Vue.jsJavaScript技术栈构建的古籍文献文字检测识别系统的完整源代码及相关项目文档。当前系统版本为`v4.0+`,基于`vue-cli`脚手架工具开发。 **环境配置运行指引:** 1. **获取项目文件**后,进入项目主目录。 2. 执行依赖安装命令: ```bash npm install ``` 若网络环境导致安装缓慢,可通过指定镜像源加速: ```bash npm install --registry=https://registry.npm.taobao.org ``` 3. 启动本地开发服务器: ```bash npm run dev ``` 启动后,可在浏览器中查看运行效果。 **构建部署:** - 生成测试环境产物: ```bash npm run build:stage ``` - 生成生产环境优化版本: ```bash npm run build:prod ``` **辅助操作命令:** - 预览构建后效果: ```bash npm run preview ``` - 结合资源分析报告预览: ```bash npm run preview -- --report ``` - 代码质量检查自动修复: ```bash npm run lint npm run lint -- --fix ``` **适用说明:** 本系统代码经过完整功能验证,运行稳定可靠。适用于计算机科学、人工智能、电子信息工程等相关专业的高校师生、研究人员及开发人员,可用于学术研究、课程实践、毕业设计或项目原型开发。使用者可在现有基础上进行功能扩展或定制修改,以满足特定应用场景需求。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【EI复现】基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(Matlab代码实现)内容概要:本文介绍了基于阶梯碳交易机制的虚拟电厂优化调度模型,重点研究了包含P2G-CCS(电转气-碳捕集封存)耦合技术和燃气掺氢技术的综合能源系统在Matlab平台上的仿真代码实现。该模型充分考虑碳排放约束阶梯式碳交易成本,通过优化虚拟电厂内部多种能源设备的协同运行,提升能源利用效率并降低碳排放。文中详细阐述了系统架构、数学建模、目标函数构建(涵盖经济性环保性)、约束条件处理及求解方法,并依托YALMIP工具包调用求解器进行实例验证,实现了科研级复现。此外,文档附带网盘资源链接,提供完整代码相关资料支持进一步学习拓展。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员或从事综合能源系统、低碳调度方向的工程技术人员;熟悉YALMIP和常用优化算法者更佳。; 使用场景及目标:①学习和复现EI级别关于虚拟电厂低碳优化调度的学术论文;②掌握P2G-CCS、燃气掺氢等新型低碳技术在电力系统中的建模应用;③理解阶梯碳交易机制对调度决策的影响;④实践基于Matlab/YALMIP的混合整数线性规划或非线性规划问题建模求解流程。; 阅读建议:建议结合提供的网盘资源,先通读文档理解整体思路,再逐步调试代码,重点关注模型构建代码实现之间的映射关系;可尝试修改参数、结构或引入新的约束条件以深化理解并拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值