分类: Android2012-03-28 23:10 2919人阅读 评论(0) 收藏 举报

最近研究了下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框架实现原理的更多相关文章

  1. 11.1 Android显示系统框架_framebuffer原理及改进

    1. Android显示系统框架Android Graphic UI with GPU Hardware Accelerationhttps://community.nxp.com/docs/DOC- ...

  2. 《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  3. [转]初探 PhoneGap 框架在 Android 上的表现

    原文地址:http://topmanopensource.iteye.com/blog/1486929 phonegap是由温哥华的一家小公司研发的多平台的移动开发框架,支持流行的大多数移动设备(iP ...

  4. 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏

    一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...

  5. Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...

  6. Android平台dalvik模式下java Hook框架ddi的分析(1)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...

  7. Android平台免Root无侵入AOP框架Dexposed使用详解

    Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...

  8. Android中免root的hook框架Legend原理解析

    一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...

  9. Android平台利用OpenCL框架实现并行开发初试

    http://www.cnblogs.com/lifan3a/articles/4607659.html 在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心.高 ...

随机推荐

  1. 【转】MarshalAs属性和使用

    转载地址:http://blog.sina.com.cn/s/blog_4e4ee8ed0100elou.html [MarshalAs(UnmanagedType.ByValArray, SizeC ...

  2. LA 3713 宇航员分组

    题目链接:http://vjudge.net/contest/142615#problem/B 题意:有A,B,C三个人物要分配个N个宇航员,每个宇航员恰好要分配一个任务,设平均年龄为X,只有年龄大于 ...

  3. Linux常用调优配置

    cenos 6.5 文件句柄和网络端口 修改系统所有进程可用句柄数,vi /etc/sysctl.conf fs.file-max=655360net.ipv4.ip_local_port_range ...

  4. CRM系统简析

    寄语: 简单阐述一下对CRM系统应用的理解,此内容参考网上资料所整理. CRM是Customer Relationship Management的缩写,简称客户关系管理. CRM系统可以从三个方面来分 ...

  5. InfoSet

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. implicit operator

    class Digit { public Digit(double d) { val = d; } public double val; // ...other members // User-def ...

  7. Monkey 使用aapt查看apk包名

    使用aapt    //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging ...

  8. Matlab 霍夫变换 ( Hough Transform) 直线检测

    PS:好久没更新,因为期末到了,拼命复习中.复习久了觉得枯燥,玩玩儿霍夫变换直线检测 霍夫变换的基本原理不难,即便是初中生也很容易理解(至少在直线检测上是这样子的). 霍夫变换直线检测的基本原理:(不 ...

  9. 【转】 void与void*详解

    void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...

  10. Python爬虫:一些常用的爬虫技巧总结

    爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...