`
墨日
  • 浏览: 19098 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

PhoneGap 1.5版本 cordova.js 简析 2

阅读更多
在了解了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 + ");");
	}

分享到:
评论
2 楼 墨日 2012-08-17  
sucess是在插件中指定的一个回调函数.

所以在前面有判断 if (success)

同理下面的fail也是失败的回调函数
1 楼 Riddle0531 2012-07-13  
success(v.message);  的sucess是调用哪里的代码吗?

相关推荐

    cordova.js 是phonegap开发必备插件JS包

    cordova.js 是phonegap开发必备插件JS包 cordova.js 是phonegap开发必备插件JS包

    cordova3.4 jar和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

    最新版本的phonegap-2.9.1是没有cordova-2.9.1.jar的,这里打包好给大家。

    Cordova3.4的js文件和jar包

    本资源包包含了Cordova 3.4版本的js文件和jar包,这些都是PhoneGap开发过程中的核心组件。 首先,我们要理解Cordova的核心概念。Cordova实际上是一个包装器,它将基于Web的技术转换为可以在各个移动平台上运行的...

    cordova phonegap

    cordova-3.4.0.jar,把这个包扔到工程的libs目录下,这样就不用引入CordovaLib 好用,自己编译的最新版本。希望大家喜欢

    Phonegap调用ios原生代码插件:cordova-ios.js

    Phonegap项目中,使用js脚本调用ios中OC代码,需要使用Phonegap提供的一个脚本插件:cordova.js

    phonegap-1.0.0rc2.zip

    这个“phonegap-1.0.0rc2.zip”文件是PhoneGap的一个早期版本,版本号为1.0.0 Release Candidate 2,这表明它是一个在正式版本发布前的候选版本,可能包含了对早期版本的改进和修复。 PhoneGap的核心理念在于利用...

    phoneGAP2.9.1.zip

    PhoneGap,实际上与Cordova是同义词,它是一个开源框架,允许开发者使用HTML、CSS3和JavaScript等Web技术来构建跨平台的移动应用程序。PhoneGap的核心思想是将Web应用包装在原生的移动应用壳中,使得这些Web应用能够...

    cordova 3.4主文件

    Cordova 3.4 主文件是开发跨平台移动应用的核心组件,主要应用于PhoneGap、Cordova和Ionic等框架。Cordova允许开发者使用Web技术(HTML、CSS和JavaScript)来构建原生的移动应用,它通过封装设备API,使得JavaScript...

    Apress.Beginning.PhoneGap.Mobile.Web.Framework.for.JavaScript.and.HTML5.2012

    《Apress.Beginning.PhoneGap.Mobile.Web.Framework.for.JavaScript.and.HTML5.2012》这本书主要探讨了如何利用PhoneGap框架结合JavaScript和HTML5技术来开发跨平台的移动应用程序。PhoneGap是一个开源框架,它允许...

    PhoneGap.3.Beginners.Guide.3rd.Edition.1784392286

    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模拟

    Cordova.Mocks是模拟对象的集合,用于模拟真实设备外部和标准浏览器中的Apache Cordova / Adob​​e Phonegap核心功能和插件功能。 安装 使用该库的最简单方法是通过在bower.json文件中添加以下依赖项来使用拉动它...

    PhoneGap开发入门借鉴.pdf

    其中,`phonegap.js`是核心JavaScript库,而`phonegap.jar`是Java库,它们都是构建PhoneGap应用所必需的。 在Eclipse中创建新的Android项目后,需要在项目结构中创建特定的目录。`libs`目录用于存放`phonegap.jar`...

    PhoneGap/Cordova的支付宝Android插件

    这个插件的目的是桥接JavaScript和Android原生代码,使PhoneGap/Cordova应用能够调用支付宝SDK,实现支付流程。 集成这个插件的过程大致如下: 1. **安装插件**:首先,开发者需要在项目的配置文件(config.xml)...

    phonegap/cordova 案例android版本

    在这个“phonegap/cordova案例android版本”中,我们将深入探讨这两个工具如何协同工作,以及如何在Android平台上创建一个简单的应用。 PhoneGap是由Adobe维护的一个开放源代码项目,它基于Cordova,并提供了额外的...

    cordova.5.1.jar

    基于PhoneGap/Cordova的Hybrid开发所需要的Cordova代码jar包,版本号是较新的5.1

    jxcore-cordova, 用于 Apache cordova/phonegap的jxcore/node.js 插件.zip

    jxcore-cordova, 用于 Apache cordova/phonegap的jxcore/node.js 插件 ( 基于 JXcore插件构建的) 插件插件目标这里项目的目的是:为 Apache Cordova ( Android,iOS ) 创建一个易于使用的node.js 插件详细显示jxcore...

    Eclipse+android+jdk+phonegap开发环境教程.pdf

    其次,需要将 PhoneGap 框架的核心文件 phonegap.js 和 phonegap.jar 复制到对应的文件夹下。 然后,需要修改工程的某些文件,包括将 Activity 的父类改为 DroidGap,并将 setContentView() 行改为 super.loadUrl(...

    phonegap3.4.0如何安装.docx

    PhoneGap 是一个流行的开源框架,它允许开发者使用 HTML5、CSS3 和 JavaScript 来构建跨平台的移动应用程序。PhoneGap 3.4.0 版本的安装过程涉及多个步骤,包括在线安装、制作 Jar 文件以及目录整理。以下是详细的...

    phonegap5.4.1(cordova)拍照并且上传功能的一个Android应用demo

    Cordova是PhoneGap的核心,它是一个原生的移动开发平台,使得Web技术能够访问设备的功能,如摄像头、文件系统和网络。本Android应用Demo展示了如何在基于PhoneGap 5.4.1的项目中实现拍照并上传功能,同时包含了Java...

Global site tag (gtag.js) - Google Analytics