`
sd6733531
  • 浏览: 66466 次
  • 性别: 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是在什么时候触发执行的?

相关推荐

    android phonegap源码详解(二)

    在本篇《Android PhoneGap源码详解(二)》中,我们将深入探讨PhoneGap这一混合移动应用开发框架的内部机制,以及如何利用它来构建原生功能丰富的Android应用。PhoneGap是一个基于Apache Cordova的开源框架,允许...

    android+phonegap+jquery mobile

    这个项目标题揭示了一个使用三种技术栈构建的移动应用程序:Android、PhoneGap和jQuery Mobile。Android是Google主导的开源操作系统,主要用于智能手机和平板电脑;PhoneGap是一个开放源代码框架,允许开发者使用...

    android PhoneGap 入门

    **Android PhoneGap 入门详解** PhoneGap 是一个开源框架,它允许开发者使用 HTML、CSS 和 JavaScript 这些Web技术来构建原生的移动应用程序。它基于 Apache Cordova 平台,通过桥接机制,将JavaScript 与移动设备...

    phonegap-splashscreen

    PhoneGap Splashscreen 知识点详解 PhoneGap 是一个开源框架,它允许开发者使用HTML、CSS和JavaScript构建原生移动应用程序。PhoneGap Splashscreen 模块则是 PhoneGap 的一个重要组件,用于在应用启动时显示一个...

    初试PhoneGap开发框架

    ### 初试PhoneGap开发框架知识点详解 #### 一、概览 本篇文章将通过一个实战案例介绍如何使用PhoneGap开发框架来构建跨平台移动应用。PhoneGap是一款开放源码的移动开发工具,允许开发者利用HTML、CSS以及...

    phonegap backup

    - **plugins**:这个文件夹可能包含了已安装的PhoneGap插件,每个插件有自己的目录,包含必要的源码和配置文件,用于扩展PhoneGap的功能。 3. **开发流程**: - **安装和配置环境**:开发者需要安装PhoneGap/...

    phonegap-plugin

    PhoneGap 插件开发详解 PhoneGap 是一个开源框架,它允许开发者使用 HTML、CSS 和 JavaScript 来构建原生移动应用程序。PhoneGap 的核心理念是通过 Web 技术来实现跨平台的移动应用开发,同时利用各平台的原生功能...

    Android_photogap

    总之,Android Photogap是利用PhoneGap框架开发的Android应用实例,通过理解和学习其源码,开发者可以更好地掌握混合应用开发技术,结合Web的便捷性和Android的广泛设备支持,高效地创建跨平台的应用程序。

    中科院计算所Android开发技术培训大纲.doc

    - 操作系统和开放联盟:讨论PhoneGap与Android操作系统的关系,以及其在开放源码社区的角色。 - 接口和工具:学习使用PhoneGap所需的开发环境和工具,如Android SDK等。 2. **HTML5 API和Event事件** - HTML5...

    CordovaTest:通过Cordova默认案例生成的Android项目源码-源码通

    **CordovaTest项目详解** **一、Cordova简介** Cordova,原名为PhoneGap,是一款开源的移动应用开发框架,允许开发者使用HTML5、CSS3和JavaScript来构建跨平台的移动应用程序。它将Web应用程序封装在原生的移动...

    Calendar-for-Android

    《构建Android日历插件:Calendar-for-Android详解》 在移动应用开发中,与用户交互的组件至关重要,其中日历功能就是一个常见的需求。本文将深入探讨名为"Calendar-for-Android"的Cordova插件,它允许开发者在...

    CalculadoraJSAndroid:使用JavaScript为Android应用程序开发的计算器

    **标题解析:** "CalculadoraJSAndroid"是一个项目名称,暗示了我们正在讨论一个使用JavaScript构建的Android应用程序,它...通过深入研究项目源码,开发者可以学习到如何在Android平台上利用JavaScript实现复杂功能。

    二开苹果cms视频网站源码模板_可封装双端app等.txt

    ### 二开苹果CMS视频网站源码模板及封装双端APP技术详解 #### 一、苹果CMS概述 苹果CMS(Apple Content Management System)是一款广泛应用于搭建视频网站的开源内容管理系统。它以其简单易用、功能强大著称,在...

    SignalStrength

    **SignalStrength 插件详解** 在移动应用开发中,了解设备的信号强度是十分重要的,尤其是在涉及通信质量或网络性能优化的情景下。SignalStrength 插件是针对 PhoneGap 平台的一个实用工具,它允许开发者获取设备的...

    TestCordova.zip

    《CorDova技术详解:构建跨平台H5与Native交互桥梁》 在移动应用开发领域,跨平台成为了不可或缺的需求。CorDova,作为一款强大的开源框架,为开发者提供了实现HTML5(H5)、JavaScript和CSS3等Web技术构建原生移动...

    ToastyPlugin:cordova插件

    **三、Java源码解析** 作为Cordova插件,`ToastyPlugin`的实现涉及Java代码,它使用Android系统的`Toast`类来创建和显示消息。在`ToastyPlugin-master`目录下,你可以找到`src/android`目录,其中包含`ToastyPlugin...

    QuizApp:电话应用程序是一个测验。 使用的技术

    PhoneGap将这些Web应用封装在原生的移动应用壳中,使得它们可以在各大移动操作系统(如iOS、Android和Windows Phone)上运行,提供了一种跨平台的开发方式。QuizApp使用PhoneGap,意味着它的代码base是基于Web的,但...

Global site tag (gtag.js) - Google Analytics