Phonegap已把源码提交到apache,成为一个非常受关注的开源框架cordova,它的跨平台的特性有点当年Java的味道和势头,成为移动平台上比较主流的解决方案。今日品味了一下它在android端的源码,看看它到底是如何结合native和web的。
首先我们总体上看看phonegap给我们提供的主要特性:
- 在本地存储和渲染HTML
- 以Native App的方式来运行
- 用JS调用Native功能
对于这样一款产品,如果让我开发,我感觉最优先要解决的问题是:
- 如何执行和渲染HTML
- web端如何高效地调用Native API(同步和异步)
- 提供怎样的扩展机制来兼容新出的Native功能
从上图我们看出它架构上的关键点:
- 基于WebView来渲染HTML
- 基于Plugin的模式来封装Native API,包括Phonegap本身提供的和开发者自己定制的
- 以覆盖prompt方法的形式来实现Web端对Android端的调用
- 以XHR或JSONP的方式来实现Android端向Web端返回异步调用的结果
1)基于WebView来渲染HTML
这点比较简单,大家都想得到,它实际上就是个内嵌的浏览器,各个移动平台也提供了这样的组件,在Android上就是WebView。
但Phonegap对WebView做了些改造,它通过扩展WebViewClient和WebChromeClient改变了些标准行为,它用 CordovaWebViewClient扩展WebViewClient,并复写shouldOverrideUrlLoading、 onPageStarted、onPageFinished等方法,使得它扩展了web纯url网页调用的行为,具备了通过geo:xxx调用 intent,通过sms:xxx发短信等能力。另外,它用CordovaChromeClient扩展WebChromeClient,并复写了 onJsAlert、onJsConfirm等方法,用Native的风格的窗口来相应js端alert、confirm的调用,使其更像是一个 native的程序。更关键的是它复写了prompt,并通过这个方法来实现js对android端的调用,下面会详细谈这点。
总之,它就是基于CordovaWebViewClient和CordovaChromeClient扩展了WebView,使其具备标准的HTML执行渲染能力外,更具备Native化的样式和能力。这块的代码我就不具体去讲了,比较简单。
2)基于Plugin的模式来封装Native API
这点也比较简单,但凡想让用户去扩展,都会想到以Plugin的模式来构架,http://wiki.phonegap.com/w/page/36752779/PhoneGap%20Plugins,这篇官方文档比较详细地讲解了如何使用和开发Plugin。
它的结构也比较扁平,总共三个类Plugin, PluginManager和PluginResult,一个配置文件plugin.xml,具体职责我就不多说,看看名字就知道了。
3)以覆盖prompt方法的形式来实现Web端对Android端的调用
这点是我学这个框架最想看的地方,虽然有点失望(感觉有点猥琐),但还是比较实用和直接。
WebChromeClient提供了一个onJsPrompt方法,这个方法是当web端调用prompt方法时就会调到。于是乎,它就把这个方 法给改了,改成Android向Web端暴露的接口,当Web要调用任何Android(Java)端的方法时,就调prompt,onJsPrompt 被调后,它再去解析参数来代理后续的行为。这时,它就主要是调用Plugin,通过Plugin来满足Web端的需求。时序图如下图所示:
前面比较好理解,但最后一步为啥要向一个server sendJavascript呢?这就是它实现异步调用的机制。
4)以XHR或JSONP的方式来实现Android端向Web端返回异步调用的结果
同步调用就不多说了,它没有上面时序图的最后一步,plugin.execute后就直接返回结果,通过JsPromptResult.confirm向js回调。
而异步调用是这个框架里难度最大的一个,而却是Native API调用大部分的适用场景,比如Camera,这都会启动Native端其他程序,等这些程序操作完了后,还需要得到它们的执行结果,比如拿到拍照后的相片。
Phonegap实际上是基于长背包的方式来实现Android端向web端的反推。长背包我就不多解释了,查查comet就能了解,它的机制就是 在web端发起ajax的周期性调用,Android端起一个本地Socket Server,并保持一个JS队列,如果有请求来,它就把队列里的JS返回,web端再执行这个JS,通过这个方式模拟了Android端向web端推动 执行结果。而上图中的sendJavascript实际上就是把执行结果用JSON的形式存在队列里等着web端来取。
但XHR(或Ajax)有跨域的限制,比如如果web端的html不是本地的file而是从远端(URL)下载下来的,那么它就不能向本地的 server发起ajax请求(因为不同域),所以它提供了一个备选方案:JSONP,这也是一个标准的解决ajax跨域的方案,实际上就是把JS下载下 来执行,这个就不多说了,可以通过关键字JSONP继续深究。
总的来说,这块采用的还是比较通用的解决方案,不过值得考量的是,这样频繁的轮询ajax是否会对性能和电池有所影响,除此之外,基本和直接Native程序是差不多的,这比直接调用HTML5确实优化不少。
这是我对phonegap在android端的源码分析,后面还想再看看在IOS和Windows Phone上是如何实现的,不过我得赶紧熟悉一下Objective-C和C#,分析完后再后续跟上。
相关推荐
PhoneGap的核心思想是将Web应用包装在原生的移动应用壳中,使得这些Web应用能够访问设备的功能,如摄像头、GPS、加速度计等,而无需编写原生代码。这个框架由Adobe公司维护,并且遵循Apache许可证。 在"phoneGAP...
1. "深入浅出 phonegap 代码.zip" - 这个文件可能是关于PhoneGap的教程或者示例代码,包含了深入讲解PhoneGap使用方法的代码示例,可以帮助初学者理解PhoneGap的工作原理和实践应用。 2. "ionic-1.1.zip" - 这是...
这个"phonegap完整例子!"是针对Android平台的一个示例项目,特别适合在pad设备上运行,并且包含了自定义插件的实现,这对于深入理解和使用PhoneGap技术尤其有帮助。 1. **PhoneGap基础概念** - PhoneGap基于Apache...
这个资源包含PhoneGap的源代码,版本为Cordova2.9,以及相关的示例程序,这为我们深入理解PhoneGap的工作原理和开发流程提供了宝贵的材料。 Cordova2.9是PhoneGap的一个重要版本,它在那时提供了对多种移动操作系统...
PhoneGap实例是一个深入实践的项目,它展示了如何利用PhoneGap框架结合jQuery Mobile或jqMobi来构建跨平台的移动应用程序。PhoneGap是一个开源框架,它允许开发者使用HTML、CSS和JavaScript来开发原生的移动应用,...
PhoneGap的核心理念是通过Web技术来桥接移动设备的原生功能,如摄像头、地理位置、存储等,让Web开发者也能开发出具有原生体验的移动应用。 在"PhoneGap拍照,图片保存应用"这个主题中,我们将探讨如何利用PhoneGap...
PhoneGap环境搭建是开发跨平台移动应用的第一步,这里我们将详细讲解如何进行PhoneGap的配置和安装。 1. **系统需求**:首先,你需要一个支持PhoneGap开发的计算机系统,通常要求是Windows、Mac OS或Linux。确保...
PhoneGap的核心理念是通过Web技术来桥接移动设备的原生功能,使得开发者无需深入学习各种平台的原生代码,就能创建功能丰富的应用。 在这个"PhoneGAP实例源码"压缩包中,包含了三个有趣的实例:汇率换算器、万圣节...
3. **PhoneGap Camera Plugin**:PhoneGap的相机插件提供了一种更简单的方式来访问设备的摄像头。开发者可以通过调用`navigator.camera.getPicture`方法,选择拍照或从相册选取图片,并获取图片的Base64编码或文件...
PhoneGap的核心理念是通过WebView技术将Web应用程序与原生设备的功能相结合,使开发者无需掌握多种原生编程语言即可实现多平台的移动应用开发。 PhoneGap的主要特点包括: 1. **跨平台开发**:PhoneGap支持Android...
PhoneGap的核心理念是通过Web技术来桥接移动设备的原生功能,如摄像头、GPS、加速度计等,为开发者提供了一个统一的API接口,使得Web应用能够访问这些硬件资源。下面,我们将深入探讨PhoneGap手机安装apk的过程以及...
### PhoneGap介绍与原理 #### 背景与挑战 随着移动互联网的快速发展,各种平台如雨后春笋般涌现,其中包括移动设备、桌面应用、Web应用及Flash应用等。这种多平台的趋势为企业和个人开发者带来了前所未有的机遇,...
PhoneGap 2.0 版本是一个较早的版本,但仍然包含了许多基础功能,使得开发者能够利用Web技术进行混合应用开发。在本实例中,我们关注的是如何在Android平台上实现视频播放功能。 首先,PhoneGap提供了访问设备API的...
这个“PhoneGap demo”是一个展示如何利用PhoneGap技术来开发Android图书商城应用的实例。它展现了PhoneGap的强大功能,将网页技术与移动设备的特性相结合,创建出具有动态效果的应用程序。 首先,我们要理解...
这个“phonegap-1.0.0rc2.zip”文件是PhoneGap的一个早期版本,版本号为1.0.0 Release Candidate 2,这表明它是一个在正式版本发布前的候选版本,可能包含了对早期版本的改进和修复。 PhoneGap的核心理念在于利用...
这个"phonegap-2.7.0源码"是PhoneGap在2.7.0版本的完整源代码,它包括了开发移动应用所需的核心组件。这个版本发布于2013年,虽然相对较老,但对于学习PhoneGap的历史和工作原理非常有帮助。 PhoneGap的核心理念是...
### PhoneGap Build的使用 #### 一、简介与背景 PhoneGap是一款开源框架,它允许开发者使用HTML、CSS和JavaScript等Web技术来构建跨平台的移动应用。PhoneGap Build则是Adobe提供的一项云端服务,用于帮助开发者更...
标题"ionic+phonegap 案例源码"表明这是一个使用了Ionic框架和PhoneGap工具开发的移动应用示例项目。Ionic是一个流行的开源HTML5移动应用框架,它允许开发者使用Web技术(如HTML, CSS, JavaScript)来构建原生感的...