简单混合应用开发

移动应用开发的方式:

移动应用开发的方式,目前主要有三种:

  1. Native App: 本地应用程序;
  2. Web App:网页应用程序;
  3. Hybrid App:混合应用程序;

Native App和Web App都有自己的优缺点,而Hybrid App在具备Native App和Web App优点的同时,也继承了两者的缺点。

 

国内外已经有一些中间件支持混合应用开发,例如:PhoneGap,AppCan,Titanium,Rexsee等,下图可以看到它们之间的一个对比:



 混合应用程序实现原理:

在本地应用程序中添加WebView来显示HTML5(CSS、JavaScript)部分的内容,逻辑操作则集中在JavaScript和本地代码中实现。通过JavaScript来实现本地代码和HTML5之间的互操作。这也是上述一些中间件实现的基本原理。

 

在Android平台上的实现:

首先我们需要一个WebView对象,然后对其属性做一些设置,具体如下:

 

		// 禁止显示垂直条
		webView.setVerticalScrollBarEnabled(false);
		
		// 允许WebView执行JavaScript
		webView.getSettings().setJavaScriptEnabled(true);
		
		// 自定义JavaScript处理
		webView.setWebChromeClient(new CustomWebChromeClient());
		
		// 绑定对象到JavaScript,这样就可以在JS中访问该对象含有的方法
		webView.addJavascriptInterface(this, "android");
		
		// 使能DOM存储API
		webView.getSettings().setDomStorageEnabled(true);
		
		// 加载HTML文件
		webView.loadUrl("file:///android_asset/game_poker.html");
 
下面给出CustomWebChromeClient的实现:

 

	class CustomWebChromeClient extends WebChromeClient {

		@Override
		public boolean onJsAlert(WebView view, String url, String message,
				JsResult result) {
			
			// 处理Alert显示效果和操作逻辑
			AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
			builder.setTitle("标题");
			builder.setMessage(message);
			builder.setPositiveButton("确定",
				new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog,
							int which) {
							webView.loadUrl("javascript:confirm();");
					}
				});
			builder.setOnKeyListener(new OnKeyListener() {
				@Override
				public boolean onKey(DialogInterface dialog, int keyCode,
						KeyEvent event) {
					return true;
				}
			});
			builder.setCancelable(false);
			AlertDialog dialog = builder.create();
			dialog.show();
			result.confirm();
			return true;
			
		}

		@Override
		public boolean onJsConfirm(WebView view, String url, String message,
				JsResult result) {
			// 处理Confirm显示效果和操作逻辑
			return super.onJsConfirm(view, url, message, result);
		}

		@Override
		public boolean onJsPrompt(WebView view, String url, String message,
				String defaultValue, JsPromptResult result) {
			// 处理Prompt显示效果和操作逻辑
			return super.onJsPrompt(view, url, message, defaultValue, result);
		}
		
	}
如果需要对Alert做不同的UI效果显示和逻辑处理,那么需要在CustomWebChromeClient中做相应处理,最简单的一种方式是可以在onJsAlert中去区别每个显示,而从message中获取这样的标志,可以简单满足这个要求。如果想从message中获取这样的标志,需要事前定义一个协议(协议的复杂程度根据项目需要可以随意定义),例如:::IntegerNumber::,代码中需要查找到“::”包含的内容,并解析得到然后做字符串分割,拿到标志和真正的显示信息即可。当然也有其它方式来完成这样的信息传递,在此不再赘述。

 

对信息的解析,以下是一种方式:

 

	/**
	 * 
	 * @param mixedString 由标志和信息组合的字符串
	 * @return result[0] : 标志 result[1] : 信息
	 * @throws Exception
	 */
	public String[] getFlagAndMessage(String mixedString) throws Exception {
		
		String result[] = new String[2];
		
		Pattern pattern = Pattern.compile("::(.+?)::");
        Matcher matcher = pattern.matcher(mixedString);
        while (matcher.find()) {
                result[0] = mixedString.substring(matcher.start() + 2, matcher.end() - 2);
                result[1] = mixedString.substring(matcher.end(), mixedString.length());
        }
        
        return result;
		
	}
 
下面要做的就是根据result[0]来做不同的处理了。

 

 如果WebView所在的Activity含有如下方法:

 

	public String getVersionName() {
	    try {
	    	PackageInfo pinfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_CONFIGURATIONS);
	    	return pinfo.versionName;
	    } catch (NameNotFoundException e) {
	    	e.printStackTrace();
	    }
	    return null;
	}
 
那么我们在JavaScript中的调用可以像下面的格式:

 

function displayVersionName() {
	alert(android.getVersionName());
}
 
遇到问题:在从JavaScript中调用Confirm时,返回结果是true或者false,经常根据这个返回结果来做不同操作。当获得返回结果有误时,可以尝试使用WebView调用相应的JavaScript代码来解决。
格式如下:
webView.loadUrl("javascript:function-name(parameters ...);");

 

如果是费时操作,也可以采用类似方式进行处理来达到想要的效果。

 

如果你认为这样定制和JS相关的Alert,Confirm,Prompt比较麻烦,而且不通用,那么自定义具有这样功能的显示效果是个不错的选择!:)

 

在iOS平台上的实现: 

和在Android平台上的实现步骤类似,同样也是需要一个WebView对象,并对属性做一些设置,如下:

 

    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"game_poker" ofType:@"html"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

 

如果想定制JavaScript弹出的Alert,Confirm等对话框,可以使用类别来实现,也可以通过Objective-C和JavaScript代码相互调用来实现,而后者也是一些第三方中间件采用的方式。

 

关键的两个方法:

 

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

 

关于这两个方法的具体如何使用,在此不在赘述,网络上有比较多的资料!:)

 

通过第一个方法来实现从JavaScript中调用,然后可以在Objective-C中对不同类型的请求做操作,通过第二个方法可以实现从Objective-C代码调用JavaScripte代码,从而实现两者的互动。从JavaScript中调用第一个方法,需要设置window.location属性,然后在第一个方法里面对做相应处理:

 

NSString *mainDocumentURL = [[request mainDocumentURL] relativePath];

 

但是要注意,window.location的字符长度是有限制的,不要准备过长的字符串,否则会被自动截断。

 

混合移动应用程序开发时,如果需要对JavaScript弹出的Alert,Confirm做定制,那么最好采用在HTML5+CSS+JavaScript重新定义的形式,而不要在Java和Objective中来做处理,这样可以让JS和本地代码之间的耦合降到最低,从而更方便的在不同平台上做移植。

 

混合移动应用在响应速度上受到浏览器执行JavaScript速度的影响。

 

为了控制页面缩放和显示时的宽度,需要在HTML中添加如下代码:

 

<meta name="viewport" content="user-scalable=no, width=device-width" />

 

采用上述方法,在Android和iOS上的简单扑克游戏效果如下(只有iOS截图):



 

 

 

 

 

 更多详细内容,请参考我们公司网站:http://www.anhuioss.com

 

 

内容概要:本文围绕EKF SLAM(扩展卡尔曼滤波同步定位与地图构建)的性能展开多项对比实验研究,重点分析在稀疏与稠密landmark环境下、预测与更新步骤同时进行与非同时进行的情况下的系统性能差异,并进一步探讨EKF SLAM在有色噪声干扰下的鲁棒性表现。实验考虑了不确定性因素的影响,旨在评估不同条件下算法的定位精度与地图构建质量,为实际应用中EKF SLAM的优化提供依据。文档还提及多智能体系统在遭受DoS攻击下的弹性控制研究,但核心内容聚焦于SLAM算法的性能测试与分析。; 适合人群:具备一定机器人学、状态估计或自动驾驶基础知识的科研人员及工程技术人员,尤其是从事SLAM算法研究或应用开发的硕士、博士研究生相关领域研发人员。; 使用场景及目标:①用于比较EKF SLAM在不同landmark密度下的性能表现;②分析预测与更新机制同步与否对滤波器稳定性与精度的影响;③评估系统在有色噪声等非理想观测条件下的适应能力,提升实际部署中的可靠性。; 阅读建议:建议结合MATLAB仿真代码进行实验复现,重点关注状态协方差传播、观测更新频率与噪声模型设置等关键环节,深入理解EKF SLAM在复杂环境下的行为特性。稀疏 landmark 与稠密 landmark 下 EKF SLAM 性能对比实验,预测更新同时进行与非同时进行对比 EKF SLAM 性能对比实验,EKF SLAM 在有色噪声下性能实验
内容概要:本文围绕“基于主从博弈的售电商多元零售套餐设计与多级市场购电策略”展开,结合Matlab代码实现,提出了一种适用于电力市场化环境下的售电商优化决策模型。该模型采用主从博弈(Stackelberg Game)理论构建售电商与用户之间的互动关系,售电商作为领导者制定电价套餐策略,用户作为跟随者响应电价并调整用电行为。同时,模型综合考虑售电商在多级电力市场(如日前市场、实时市场)中的【顶级EI复现】基于主从博弈的售电商多元零售套餐设计与多级市场购电策略(Matlab代码实现)购电组合优化,兼顾成本最小化与收益最大化,并引入不确定性因素(如负荷波动、可再生能源出力变化)进行鲁棒或随机优化处理。文中提供了完整的Matlab仿真代码,涵盖博弈建模、优化求解(可能结合YALMIP+CPLEX/Gurobi等工具)、结果可视化等环节,具有较强的可复现性工程应用价值。; 适合人群:具备一定电力系统基础知识、博弈论初步认知Matlab编程能力的研究生、科研人员及电力市场从业人员,尤其适合从事电力市场运营、需求响应、售电策略研究的相关人员。; 使用场景及目标:① 掌握主从博弈在电力市场中的建模方法;② 学习售电商如何设计差异化零售套餐以引导用户用电行为;③ 实现多级市场购电成本与风险的协同优化;④ 借助Matlab代码快速复现顶级EI期刊论文成果,支撑科研项目或实际系统开发。; 阅读建议:建议读者结合提供的网盘资源下载完整代码与案例数据,按照文档目录顺序逐步学习,重点关注博弈模型的数学表达与Matlab实现逻辑,同时尝试对目标函数或约束条件进行扩展改进,以深化理解并提升科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值