在了解了phonegap的最基本的定义和调用的方法之后,继续看看和手机的通信部分.
在1.5之前的版本,phonegap在android的通信方式是通过js的prompt来实现的(具体其他文章有详细讲解),关键的部分由下面的几个函数组成
PhoneGap.exec = function(success, fail, service, action, args)
PhoneGap.callbackSuccess = function(callbackId, args)
PhoneGap.callbackError = function(callbackId, args)
而在1.5之后,采用的往往是这种格式
var exec = require("cordova/exec");
exec(successCallback, errorCallback, "Accelerometer","getAcceleration", []);
首先还是从exec函数入手,分析下phonegap的通信方式,在js端的exec定义中可以看到执行命令实际只是一个简单的js的prompt函数,将调用的方法、参数等信息以字符串的方式传入。
var r = prompt(JSON.stringify(args), "gap:"+ JSON.stringify([service,action,callbackId, true]));
在android端通过,下面的代码,劫持了字符串信息,并且通过分析最终调用到具体的服务类.
//所在函数 org.apache.cordova.CordovaChromeClient.onJsPrompt
if (reqOk && defaultValue != null && defaultValue.length() > 3 && defaultValue.substring(0, 4).equals("gap:")) {
JSONArray array;
try {
array = new JSONArray(defaultValue.substring(4));
String service = array.getString(0);
String action = array.getString(1);
String callbackId = array.getString(2);
boolean async = array.getBoolean(3);
String r = ctx.pluginManager.exec(service, action, callbackId, message, async);
result.confirm(r);
} catch (JSONException e) {
e.printStackTrace();
}
}
对普通的插件而言存在两种结果
1. 异步调用,在非异常的情况下都返回""
2. 同步调用,会将结果作为json字符串传送回js端
取得结果后js端会直接放弃所有的""结果,然后分析同步结果
// line 757 成功返回处理
if (v.status === cordova.callbackStatus.OK) {
if (success) {
try {
success(v.message);
} catch (e) {
console.log("Error in success callback: "
+ callbackId + " = " + e);
}
if (!v.keepCallback) {
delete cordova.callbacks[callbackId];
}
}
return v.message;
}
// line 788 失败处理
else {
if (fail) {
try {
fail(v.message);
} catch (e1) {
console.log("Error in error callback: "
+ callbackId + " = " + e1);
}
if (!v.keepCallback) {
delete cordova.callbacks[callbackId];
}
}
return null;
}
对于同步的请求,在返回结果后会直接调用插件定义的回调函数进行处理.
而异步的请求,则需要通过android的处理,触发页面的页面的事件,然后相应.在最开始可以看到每个请求都有唯一的服务id,并且通过回调事件缓存池将方法缓存.
var callbackId = service + cordova.callbackId++;
if (success || fail) {
cordova.callbacks[callbackId] = {
success : success,
fail : fail
};
}
当android的任务完成以后,会通过Plugin类的success函数返回成功结果,而这个操作实际就是向webview发起一个js请求.
//line 157 org.apache.cordova.api.Plugin
public void success(PluginResult pluginResult, String callbackId) {
this.ctx.sendJavascript(pluginResult.toSuccessCallbackString(callbackId));
}
//line 86 org.apache.cordova.api.PluginResult
public String toSuccessCallbackString(String callbackId) {
return "require('cordova').callbackSuccess('"+callbackId+"',"+this.getJSONString()+");";
}
然后通过js端的回调服务callbackSuccess来实现异步结果返回.
但是任然有部分的代码中的返回是通过特定的函数来实现,如地理位置中的返回,就仍然采用了原有的模式(因为大部分设备使用的是浏览器自带的定位,所以感觉不到问题),所以如果不做相应修改就会产生错误.
// line 81 org.apache.cordova.GeoListener.success
void success(Location loc) {
String params = loc.getLatitude() + "," + loc.getLongitude() + ", " + loc.getAltitude() +
"," + loc.getAccuracy() + "," + loc.getBearing() +
"," + loc.getSpeed() + "," + loc.getTime();
if (id == "global") {
this.stop();
}
this.broker.sendJavascript("navigator._geo.success('" + id + "'," + params + ");");
}
分享到:
相关推荐
cordova.js 是phonegap开发必备插件JS包 cordova.js 是phonegap开发必备插件JS包
在这个主题中,我们主要关注的是 Cordova 3.4 版本,它包含了 `cordova-3.4.0.jar` 和 `cordova.js` 这两个关键文件。 `cordova-3.4.0.jar` 文件是 Cordova 的 Java 库,它是 Android 平台上的核心组件。这个 JAR ...
最新版本的phonegap-2.9.1是没有cordova-2.9.1.jar的,这里打包好给大家。
本资源包包含了Cordova 3.4版本的js文件和jar包,这些都是PhoneGap开发过程中的核心组件。 首先,我们要理解Cordova的核心概念。Cordova实际上是一个包装器,它将基于Web的技术转换为可以在各个移动平台上运行的...
cordova-3.4.0.jar,把这个包扔到工程的libs目录下,这样就不用引入CordovaLib 好用,自己编译的最新版本。希望大家喜欢
Phonegap项目中,使用js脚本调用ios中OC代码,需要使用Phonegap提供的一个脚本插件:cordova.js
这个“phonegap-1.0.0rc2.zip”文件是PhoneGap的一个早期版本,版本号为1.0.0 Release Candidate 2,这表明它是一个在正式版本发布前的候选版本,可能包含了对早期版本的改进和修复。 PhoneGap的核心理念在于利用...
PhoneGap,实际上与Cordova是同义词,它是一个开源框架,允许开发者使用HTML、CSS3和JavaScript等Web技术来构建跨平台的移动应用程序。PhoneGap的核心思想是将Web应用包装在原生的移动应用壳中,使得这些Web应用能够...
Cordova 3.4 主文件是开发跨平台移动应用的核心组件,主要应用于PhoneGap、Cordova和Ionic等框架。Cordova允许开发者使用Web技术(HTML、CSS和JavaScript)来构建原生的移动应用,它通过封装设备API,使得JavaScript...
《Apress.Beginning.PhoneGap.Mobile.Web.Framework.for.JavaScript.and.HTML5.2012》这本书主要探讨了如何利用PhoneGap框架结合JavaScript和HTML5技术来开发跨平台的移动应用程序。PhoneGap是一个开源框架,它允许...
Chapter 2: Building Your First PhoneGap Project Chapter 3: Mobile Frameworks Chapter 4: Working with Plugins Chapter 5: Using Device Storage and the Files API Chapter 6: Using the Contacts and Camera ...
Cordova.Mocks是模拟对象的集合,用于模拟真实设备外部和标准浏览器中的Apache Cordova / Adobe Phonegap核心功能和插件功能。 安装 使用该库的最简单方法是通过在bower.json文件中添加以下依赖项来使用拉动它...
其中,`phonegap.js`是核心JavaScript库,而`phonegap.jar`是Java库,它们都是构建PhoneGap应用所必需的。 在Eclipse中创建新的Android项目后,需要在项目结构中创建特定的目录。`libs`目录用于存放`phonegap.jar`...
这个插件的目的是桥接JavaScript和Android原生代码,使PhoneGap/Cordova应用能够调用支付宝SDK,实现支付流程。 集成这个插件的过程大致如下: 1. **安装插件**:首先,开发者需要在项目的配置文件(config.xml)...
在这个“phonegap/cordova案例android版本”中,我们将深入探讨这两个工具如何协同工作,以及如何在Android平台上创建一个简单的应用。 PhoneGap是由Adobe维护的一个开放源代码项目,它基于Cordova,并提供了额外的...
基于PhoneGap/Cordova的Hybrid开发所需要的Cordova代码jar包,版本号是较新的5.1
jxcore-cordova, 用于 Apache cordova/phonegap的jxcore/node.js 插件 ( 基于 JXcore插件构建的) 插件插件目标这里项目的目的是:为 Apache Cordova ( Android,iOS ) 创建一个易于使用的node.js 插件详细显示jxcore...
其次,需要将 PhoneGap 框架的核心文件 phonegap.js 和 phonegap.jar 复制到对应的文件夹下。 然后,需要修改工程的某些文件,包括将 Activity 的父类改为 DroidGap,并将 setContentView() 行改为 super.loadUrl(...
PhoneGap 是一个流行的开源框架,它允许开发者使用 HTML5、CSS3 和 JavaScript 来构建跨平台的移动应用程序。PhoneGap 3.4.0 版本的安装过程涉及多个步骤,包括在线安装、制作 Jar 文件以及目录整理。以下是详细的...
Cordova是PhoneGap的核心,它是一个原生的移动开发平台,使得Web技术能够访问设备的功能,如摄像头、文件系统和网络。本Android应用Demo展示了如何在基于PhoneGap 5.4.1的项目中实现拍照并上传功能,同时包含了Java...