`
sd6733531
  • 浏览: 66688 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android phonegap源码详解(三)

阅读更多

 

传送门:

PhoneGap源码详解一

PhoneGap源码详解二

PhoneGap源码详解三

 

一、 PhoneGap 的启动

近期因为赶项目和犯懒,所以一直没有更新,希望朋友们见谅。

前面介绍过 phoneGap 的模块化机制。其通过 require 和 define ,巧妙的将模块的定义和依赖关系隔离开来。


 

如上图所示,在定义模块机制后。后面统统都是做 define 。那么,这些被定义的模块最终何时被实例化呢?


 

在 cordova.js 的末尾我们找到了这一句。第一个被请求实例化的模块是 cordova(adobe 版本是 phonegap) ,接着在实例化 cordova 模块后, cordova 依赖的模块也纷纷被实例化出来了。 (channel 、 utils)

cordova 模块仅是个最基础的顶层通信模块。除了 cordova 模块外,其余数十个 phonegap 模块都还在沉睡之中。事实上,这一步走完其实 phonegap 已经完成了。 Phonegap 用户只需要 require(‘cordova/plugin/contacts’) 这样,即可访问到 phonegap 的功能。

但是,这样做还不够好。第一 ,require 对于 phonegap 使用者来说并不友好。第二,虽然可以通过 require 得到构建模块的实例,可这并不代表 Native/Javascript 的通信关系已经建立。 phonegap 用户还不知道何时可以安全正确的使用这些功能。

基于上面两点, phonegap 构建了一个 bootstrap 函数。在上图的后一句,大家可以看到 bootstrap 的封闭调用。下面我来详解一下 bootstrap

二、 Bootstrap 详解

首先贴上代码。

 

(function (context) {

    var channel = require("cordova/channel"),

        _self = {

            boot: function () {

                /**

                 * Create all cordova objects once page has fully loaded and native side is ready.

                 */

                channel.join(function() {

                    var builder = require('cordova/builder'),

                        base = require('cordova/common'),

                        platform = require('cordova/platform');

 

                    // Drop the common globals into the window object, but be nice and don't overwrite anything.

                    builder.build(base.objects).intoButDontClobber(window);

 

                    // Drop the platform-specific globals into the window object

                    // and clobber any existing object.

                    builder.build(platform.objects).intoAndClobber(window);

 

                    // Merge the platform-specific overrides/enhancements into

                    // the window object.

                    if (typeof platform.merges !== 'undefined') {

                        builder.build(platform.merges).intoAndMerge(window);

                    }

 

                    // Call the platform-specific initialization

                    platform.initialize();

 

                    // Fire event to notify that all objects are created

                    channel.onCordovaReady.fire();

 

                    // Fire onDeviceReady event once all constructors have run and

                    // cordova info has been received from native side.

                    channel.join(function() {

                        channel.onDeviceReady.fire();

                    }, channel.deviceReadyChannelsArray);

 

                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);

            }

        };

 

    // boot up once native side is ready

    channel.onNativeReady.subscribeOnce(_self.boot);

 

    // _nativeReady is global variable that the native side can set

    // to signify that the native code is ready. It is a global since

    // it may be called before any cordova JS is ready.

    if (window._nativeReady) {

        channel.onNativeReady.fire();

    }

 

}(window));

 

 

我们先来详细关注下, phonegap 是如何提供回调通知,来告诉用户 Native 与 Javascript 之间成功建立联系的呢?

首先, bootstrap 通过 channel 模块注册监听了 onNativeReady 事件。这个事件由 Native 层触发,用来表示 Native 层准备完毕 ( 可以接受 plugin 调用 ) 。在 Android 平台上面 ,onNativeReady 是在 WebView 的 onPageFinished 回调中触发的。


 

  为了安全的启动 ,boot 等待 onNativeReady 和 onDOMContentLoaded 完毕后才执行。那么 Phonegap 的 boot 都做了些什么呢 ?

boot 做了两件事情。首先是实例化和发布模块来给 phonegap 用户使用。其次是广播 onCordovaReady 来通知 phonegap 层 boot 完毕 , 用户可以放心使用 phonegap 的功能。

通过 builder, 模块的实例化和发布工作变得很艺术。 builder 模块提供三种发布方式 , 分别是 intoButDontClobber( 若发布目标中已存在同名模块 , 则不允许做覆盖 ),intoAndClobber( 若发布目标中已存在同名模块 , 则强制覆盖 ),intoAndMerge( 若发布目标中已存在实例模块 , 则尝试对两者进行合并,合并的优先级是欲发布模块比发布模块高 )

解释一下“发布”这个词。其实就是根据定义 id 实例化 (require) 模块 , 然后把它作为某个 object 的属性。从 boot 的源码中,我们可以看到。在 common.js 和 platform.js 中,分别定义了 objects 对象。 objects 定义了各个模块的 id 和层次关系。父子关系通过 children 字段表明。

 

    objects: {

        cordova: {

            path: 'cordova',

            children: {

                exec: {

                    path: 'cordova/exec'

                }

            }

        },

 

         根据上面的定义, cordova 模块下将挂一个 exec 模块。即通过 builder 后 , 用户可以直接通过 cordova.exec 来访问 exec 模块。

         当然 , 发布的 target 都是 window 。 common 下的发布定义 (objects) ,所使用的发布策略是不覆写原有属性。之所以这样做,是考虑到之后浏览器加强 html5 支持后,有些模块将会原生提供。

platform 下的发布定义 (objects) 所使用的发布策略是覆写所有属性。其定义的是与平台密切相关的模块,因此会做强制覆写。

注意 platform 下的发布定义,除了 objects 外。还提供了 merge 定义。这里的 merge 作用在于“增强”。为原有的通用模块,增加一些平台相关的其它方法。在 android/platform.js 的 merges 定义便是一个例子。最终发布的 notification 将既包含 common 下 notification.js 的 alert 方法,也包含 platform 下 notification.js 的 activityStart 方法。

发布模块后会执行 platform.initialize 方法。这个方法用于做 platform 初始化工作,将与平台特性紧耦合,尤其会与 Native 与 Javascript 互相通信相关。在 android 平台版本中 ,initialize 包含了 polling/xhr 的初始化, android 的按键事件、可兼容 web 数据库 api 与 localstorage 。当这些工作完毕后,将会广播 onCordovaReady 事件。此后便可以安全的使用 phonegap 所提供的所有功能了。

onCordovaReady 后会去准备 onDeviceReady 。关于 onDeviceReady 的详细描述,我在上篇解析的 channel 中提过了,在此也就不重复了。

三、 总结

至此 phonegap 的 Native 与 Javascript 层源码解析完毕。有关如何扩展 phonegap 插件,各位可以参照 github 上面的这个开源项目: https://github.com/purplecabbage/phonegap-plugins

需要注意的是。其中的 addPlugin 写法 ,phonegap 已经不再推荐使用了。并表示该方法将在 2.0 版本中移除。

由于本人真正接触 phonegap 时间并不长,难免会有解释不当的地方。欢迎指正!也欢迎跟帖讨论!

  • 大小: 146 KB
  • 大小: 149.5 KB
  • 大小: 125.4 KB
2
0
分享到:
评论
5 楼 ZeroWinNing 2013-09-26  
分析的很好,希望以后phonegap能够成为移动端软件开发的标准
4 楼 hsz001 2012-11-13  
感谢楼主的分享,帮助解决了个问题~
3 楼 Andevery 2012-07-23  
sd6733531 写道
Andevery 写道
请教一下LZ,
networkStatus 和 deviceReady是在什么时候触发执行的?

兄台,不好意思。这两天有事外出。关于deviceReady,请参考本人的上一篇博客,phonegap解析2。
至于networkStatus,它被触发是在网络环境更改时被触发,关于这个可以参考本地层的NetWorkManager.java来观察(getConnectionInfo)。
补充一点的是,监听的android系统网络切换广播,在首次执行app的时候会触发。(不管网络环境是否切换).



了解了,谢谢你!
2 楼 sd6733531 2012-07-22  
Andevery 写道
请教一下LZ,
networkStatus 和 deviceReady是在什么时候触发执行的?

兄台,不好意思。这两天有事外出。关于deviceReady,请参考本人的上一篇博客,phonegap解析2。
至于networkStatus,它被触发是在网络环境更改时被触发,关于这个可以参考本地层的NetWorkManager.java来观察(getConnectionInfo)。
补充一点的是,监听的android系统网络切换广播,在首次执行app的时候会触发。(不管网络环境是否切换).
1 楼 Andevery 2012-07-18  
请教一下LZ,
networkStatus 和 deviceReady是在什么时候触发执行的?

相关推荐

    第11讲:深入理解指针(1).pdf

    第11讲:深入理解指针(1)

    springboot整合 freemarker方法

    springboot整合 freemarker方法

    第14讲:深入理解指针(4).pdf

    第14讲:深入理解指针(4)

    同行者4.1.2语音助手

    《同行者4.1.2语音助手:车机版安装详解》 在现代科技日新月异的时代,智能车载设备已经成为了汽车生活的重要组成部分。"同行者4.1.2"便是这样一款专为车机设计的语音助手,旨在提供更为便捷、安全的驾驶体验。该版本针对掌讯全系列设备进行了兼容优化,让车主能够轻松实现语音控制,减少驾驶过程中的手动操作,提升行车安全性。 我们来了解下"同行者4.1.2"的核心功能。这款语音助手集成了智能语音识别技术,用户可以通过简单的语音指令完成导航、音乐播放、电话拨打等一系列操作,有效避免了因操作手机或车机带来的分心。此外,其强大的语义理解和自学习能力,使得它能逐步适应用户的口音和习惯,提供更个性化的服务。 在安装过程中,用户需要注意的是,"同行者4.1.2"包含了四个核心组件,分别是: 1. TXZCore.apk:这是同行者语音助手的基础框架,包含了语音识别和处理的核心算法,是整个应用运行的基础。 2. com.txznet.comm.base.BaseApplication.apk:这个文件可能包含了应用的公共模块和基础服务,为其他组件提供支持。 3. TXZsetting.apk:这

    市场拓展主管绩效考核表.xls

    市场拓展主管绩效考核表

    “线上购车3D全方位体验:汽车模型展示与个性化定制功能”,three.js案例- 线上购车3d展示(源码) 包含内容:1.汽车模型展示;2.汽车肤;3.轮毂部件更;4.开关车门动画;5.汽车尺寸测量

    “线上购车3D全方位体验:汽车模型展示与个性化定制功能”,three.js案例- 线上购车3d展示(源码) 包含内容:1.汽车模型展示;2.汽车肤;3.轮毂部件更;4.开关车门动画;5.汽车尺寸测量;6.自动驾驶;7.镜面倒影;8.hdr运用;9.移动端适配; 本为html+css+three.js源码 ,核心关键词:three.js案例; 线上购车3D展示; 汽车模型展示; 汽车换肤; 轮毂部件更换; 开关车门动画; 汽车尺寸测量; 自动驾驶; 镜面倒影; HDR运用; 移动端适配; HTML+CSS+three.js源码。,"Three.js源码:线上购车3D展示案例,含汽车模型、换肤、轮毂更换等九大功能"

    (数据权威)中国城市_县域统计面板数据二合一

    数据名称:2000-2022年各县市区主要社会经济发展指标面板数据 数据类型:dta格式 数据来源:中国县域统计

    120页-环卫车项目初步方案.pdf

    一、智慧环卫管理平台的建设背景与目标 智慧环卫管理平台的建设源于对环卫管理全面升级的需求。当前,城管局已拥有139辆配备车载GPS系统、摄像头和油耗传感器的环卫车辆,但环卫人员尚未配备智能移动终端,公厕也缺乏信息化系统和智能终端设备。为了提升环卫作业效率、实现精细化管理并节省开支,智慧环卫管理平台应运而生。该平台旨在通过信息化技术和软硬件设备,如车载智能终端和环卫手机App,实时了解环卫人员、车辆的工作状态、信息和历史记录,使环卫作业管理透明化、精细化。同时,平台还期望通过数据模型搭建和数据研读,实现更合理的环卫动态资源配置,为环卫工作的科学、健康、持续发展提供决策支持。 二、智慧环卫管理平台的建设内容与功能 智慧环卫管理平台的建设内容包括运行机制体制建设、业务流程设计、智慧公厕系统建设、网络建设、主机和储存平台需求、平台运维管理体系、硬件标准规范体系以及考核评价体系等多个方面。其中,智慧公厕系统建设尤为关键,它能实时监控公厕运行状态,保障公厕的清洁和正常运行。平台建设还充分利用了现有的电子政务网络资源,并考虑了有线和无线网络的需求。在功能上,平台通过普查、整合等手段全面收集环卫车辆、企业、人员、设施、设备等数据,建立智慧环卫基础数据库。利用智能传感、卫星定位等技术实现环卫作业的在线监管和远程监控,实现对道路、公共场所等的作业状况和卫生状况的全面监管。此外,平台还建立了环卫作业网格化管理责任机制,实现从作业过程到结果的全面监管,科学评价区域、部门、单位和人员的作业效果。 三、智慧环卫管理平台的效益与风险规避 智慧环卫管理平台的建设将带来显著的环境、经济和管理效益。环境方面,它将有力推进环境卫生监管服务工作,改善环境卫生状况,为人民群众创造更加清洁、卫生的工作和生活环境。经济方面,通过智慧化监管,大大降低了传统管理手段的成本,提高了监管的准确性和效率。管理方面,平台能够追踪溯源市民反映的问题,如公厕异味、渣土车辆抛洒等,并找到相应的责任单位进行处置,防止类似事件再次发生。同时,平台还拥有强大的预警机制功能,能够在很多环卫问题尚未出现前进行处置。然而,平台建设也面临一定的风险,如部门协调、配合问题,建设单位选择风险以及不可预测的自然灾害等。为了规避这些风险,需要加强领导、统一思想,选择优秀的系统集成商承接项目建设,并做好计算机和应用系统的培训工作。同时,也要注意标准制定工作和相关法律法规的制定工作,以保证系统建设完成后能够真正为环卫管理工作带来便利。

    36 -企业管理主管绩效考核表1.xlsx

    36 -企业管理主管绩效考核表1

    1.1 -1.4 工程代码

    1.1 -1.4 工程代码

    USDT合约,USDT智能合约

    USDT合约,USDT智能合约

    基于姿态估计三维人脸形状重建.pdf

    基于姿态估计三维人脸形状重建.pdf

    一般员工绩效考核表模板(通用版) (2).xls

    一般员工绩效考核表模板(通用版) (2)

    全国295个地级市2011-2022互联网宽带接入用户数互联网普及率(数据权威)

    全国各省295地级市互联网普及率、互联网用户数、每百人互联网宽带用户(2011-2022年) 数据年份:2011-2022年(2022存在部分缺失) 数据范围:全国各省295个地级市 数据来源:地方统计局

    (数据权威)碳排放、碳中和、碳交易、碳金融、碳计算、碳建模资料

    一、各省、分行业CO2排放、283个地级市碳排放及计算过程 2.分行业二氧化碳排放量 在这里插入图片描述 3、280多个地级市碳排放及计算过程 二、碳中和文献、最新政策、碳金融数据+数学建模 1.二氧化碳减排规划,碳金融数据收集及数学建模 2.碳中和政策和下载量最高的碳中和论文 三、碳排放+碳市场+碳交易+碳中和+碳排放核算Excel自动计算表 全行业碳排放核算Excel自动计算表 四、碳交易数据 五、主要能源碳排放计算参数

    第20讲:自定义类型:结构体.pdf

    第20讲:自定义类型:结构体

    视觉跟踪算法综述.pdf

    视觉跟踪算法综述.pdf

    MATLAB超效率SBM-DEA模型代码详解:简易操作指南及期望与非期望产出的超效率分析,附Malmquist指数与分解功能,MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西

    MATLAB超效率SBM-DEA模型代码详解:简易操作指南及期望与非期望产出的超效率分析,附Malmquist指数与分解功能,MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西),操作很简单 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解 ,MATLAB; SBM-DEA模型; 超效率SBM-DEA; 安装教程; 内容讲解; 期望产出; 非期望产出; 超效率与非超效率sbm模型; Malmquist指数; 分解。,"MATLAB超效SBM-DEA模型代码:非期望产出分析的便捷工具"

    人事行政主管绩效考核评分表.xls

    人事行政主管绩效考核评分表

    人力资源管理工具绩效考核excel模板.xlsx

    人力资源管理工具绩效考核excel模板

Global site tag (gtag.js) - Google Analytics