分类: 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. jQuery 选择器 (基础恶补之三)+Ajax

    jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector). ...

  2. CentOS 更改yum源与更新系统

    FROM:http://www.cnblogs.com/lightnear/archive/2012/10/03/2710952.html [1] 首先备份/etc/yum.repos.d/CentO ...

  3. zigbee学习之路(五):定时器1(查询方式)

    一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...

  4. http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

    The Contoso University sample web application demonstrates how to create ASP.NET MVC 5 applications ...

  5. 一个java的DES加密解密类转换成C#

    一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...

  6. JMeter进行简单的数据库(mysql)压力测试

    1.点击测试计划,再点击“浏览”,把JDBC驱动添加进来: 注:JDBC驱动一般的位置在java的安装地址下,路径类似于:    \java\jre\lib\ext 文件为:mysql-connect ...

  7. 正则表达式获取TABLE里的内容

    //过滤\n 转换成空            String withoutNString=message.Replace("\n", "");          ...

  8. 从零搭建mongo分片集群的简洁方法

    一.目录 1.mongo路径,config数据路径,shard数据路径

  9. Python之路 day2 购物车小程序1

    #Author:ersa ''' 程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时 ...

  10. null 和 undefined 的区别

    null表示"没有对象",即该处不应该有值. (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. undefiend 就是一个缺少值,此处应该有的值 ...