(转)android平台phonegap框架实现原理
最近研究了下phonegap手机快速开发框架原理,重点探究了android平台上的phonegap框架源码,在参考cutesource写的phonegap源码分析后,更加深入理解了phonegap框架原理,其中有些思想或许在以后有帮助,故总结下phonegap框架中关键点。
1. Phonegap如何实现跨平台?
Phonegap在每个移动平台(iOS、android、blackberry、…)中都实现了一套后台框架,分别与各平台系统API进行交互,从而调用其native API,对应用开发人员提供了统一的JS调用接口,即phonegap API,开发人员只需要采用html、js、css等web技术即可进行移动平台快速开发。
Phonegap的“一次编写,到处运行”是指应用程序开发只需编写前端代码,并且可完全复用到其他平台,复用到其他平台时需要另外搭建相应的开发环境才能运行。
2. Phonegap框架实现原理
下图借用了cutesource文章中的原图做了小小改动,增加了同步/异步返回流程。

图 Phonegap框架原理图
Phonegap框架实现原理有如下几个关键点:
1) 基于移动终端上内嵌的浏览器即WebView来渲染解析HTML,在phonegap框架的WebView中重点重写了onJsPrompt方法,来捕获前端的业务请求操作(phonegap.js文件中exec函数中的prompt操作),从而将Web前端与后台Java程序连接起来。
2) 基于Plugin的模式来封装调用Native API,用户可以扩展自定义Plugin功能。
3) 同步/异步请求操作的区别:WebView捕获到请求操作后,根据捕获的参数去调用对应的plugin。
如果是同步请求,则直接将结果立即返回到前端,即phonegap.js文件exec函数中
var r = prompt(JSON.stringify(args),"gap:"+JSON.stringify([service, action, callbackId, true]));会立即获得调用返回结果;
如果是异步请求,则将结果存入Callback的链表中,从而通过XHR通道传到前端,即phonegap.js文件PhoneGap.JSCallback函数中
var msg = decodeURIComponent(xmlhttp.responseText);会获得调用返回结果。
4) CallbackServer监听服务线程
CallbackServer线程在phonegap框架被首次加载时就启动,然后会同时监听前端的XHR请求和链表中有无数据,当有XHR请求来时,若链表为空,线程会最多等待10s,在等待过程如果链表中有数据来,会唤醒等待的线程,从而立即将链表中数据传到前端;若10s后没有数据,则将空数据返回到前端,从而发起下一轮XHR请求;这就是所谓的“基于服务器推技术”模型。如下图phonegap中数据流图。

图 Phonegap数据流程图
3.扩展自定义功能插件开发注意事项:
自定义插件类在继承Plugin时,要考虑重写其isSynch方法及其是否异步/同步返回值,否则在使用自定义插件时会出现问题。
(转)android平台phonegap框架实现原理的更多相关文章
- 11.1 Android显示系统框架_framebuffer原理及改进
1. Android显示系统框架Android Graphic UI with GPU Hardware Accelerationhttps://community.nxp.com/docs/DOC- ...
- 《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- [转]初探 PhoneGap 框架在 Android 上的表现
原文地址:http://topmanopensource.iteye.com/blog/1486929 phonegap是由温哥华的一家小公司研发的多平台的移动开发框架,支持流行的大多数移动设备(iP ...
- 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏
一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...
- Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...
- Android平台dalvik模式下java Hook框架ddi的分析(1)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...
- Android平台免Root无侵入AOP框架Dexposed使用详解
Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...
- Android中免root的hook框架Legend原理解析
一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...
- Android平台利用OpenCL框架实现并行开发初试
http://www.cnblogs.com/lifan3a/articles/4607659.html 在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心.高 ...
随机推荐
- 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植
一.移植环境: 1.主机:Ubuntu 10.10发行版 2.目标机:FS_S5PC100平台 3.交叉编译工具:arm-cortex_a8-linux-gn ...
- vs2013-tfs-疑问之版本控制器路径有双引号解决办法
问题描述: 最近项目:“****”展示交易平台 ,所以版本控制器路径为: 导致生成解决方案提示:路径有问题 解决办法: 1.直接在版本控制器重命名是不支持的,需要安装: Visual Studio ...
- VIM 常用错误解决
1.option ‘omnifunc’ is not set 错误: vim7下Omni completion默认情况下是没有开启的,有时候自定义的vimrc文件会实现自动补齐,例如vim-autoc ...
- javax.servlet.ServletException: com.ibatis.sqlmap.client.SqlMapException: There is no statement named...问题
可能存在3种情况: 1.在xxx.xml文件中有两个标签的id命名相同: 2.DAO实现类方法中没有写对应xxx.xml的id名称: 3.实体映射文件xxx.xml未加入到sqlMap-Config. ...
- python(六)内置函数
一.函数知识补充 函数不设置值,默认返回None:函数中参数都是按引用传递,函数里修改了参数,原始参数也会修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- [问题2014S02] 解答
[问题2014S02] 解答 首先注意到: 两个实系数多项式 \(f(x),g(x)\) 互素当且仅当 \(f(x),g(x)\) 在复数域 \(\mathbb{C}\) 上没有共公根, 当且仅当结 ...
- lambda的使用ret = filter(lambda x : x > 22 ,[11,22,33,44])
#!/usr/bin/env python #def f1(x) : # return x > 22 ret = filter(lambda x : x > 22 ,[11,22,33,4 ...
- Java开发中经典的小实例-(100能被3整除的数打印出来)
public class Test21 { public static void main(String[] args) { // TODO Auto-generated meth ...
- 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析
献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 数据分析基础概念:集中趋势分析是指在大量测评数据分布中,测评数据向某点集中的情况.总体(population)是指客观存在 ...
- Unicode 与(UTF-8,UTF-16,UTF-32,UCS-2)
Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. U+597D = 好 597D 是1 ...