版权声明:本文为博主offbye西涛原创文章。未经博主同意不得转载。 https://blog.csdn.net/offbye/article/details/31776833

PhoneGap/Cordova是一个专业的移动应用开发框架,是一个全面的WEB APP开发的框架,提供了以WEB形式来訪问终端设备的API的功能。

这对于採用WEB APP进行开发人员来说是个福音。这能够避免了原生开发的某些功能。

Cordova 仅仅是个原生外壳,app的内核是一个完整的webapp。须要调用的原生功能将以原生插件的形式实现,以暴露js接口的方式调用。

       Cordova Android项目是Cordova Android原生部分的Java代码实现。提供了Android原生代码和上层Web页面的javascript通讯接口。本系列文章主要分析Cordova Android框架代码的实现。通过深入分析cordova Android源代码的实现,我们在开发HybridApp时能够更从容,知道Cordova的插件的工作原理。开发cordova插件整合自己的功能模块。在实现web应用时避开js和webview的一些坑。开发出高质量的混合应用。
       项目源代码能够在https://git-wip-us.apache.org/repos/asf找到。上面展示了cordova所有子项目的git地址。当你创建cordova应用,并通过cordova platform add Android命令加入android平台后,在应用的platforms/android/CordovaLib/src/org/apache/cordova文件夹以下能够找到Cordova Android框架代码。

       cordova3.5版本号Android核心框架一共同拥有27个java文件,代码量不算大。从cordova3.0版本号以后。所有的设备能力API都从cordova核心框架分离出去,变成了插件,各平台分别进行原生实现,比如訪问设备信息的Device插件,訪问网络状态的Network Information插件。眼下官方站点一共收录了250个插件。以下是 Cordova Android的总体UML类图,从这张图上我们看出核心框架和插件之间的关系。插件须要实现CordovaPlugin接口。

Cordova框架类图

   

  • CordovaInterface接口分析

           CordovaInterface是Cordova应用的底层接口,CordovaActivity须要实现这个接口。

用来隔离Cordova插件开发,隔离插件对Cordova核心库的直接依赖。

   主要方法有startActivityForResult。setActivityResultCallback,getActivity,onMessage。getThreadPool这几个接口方法。详细的实如今CordovaActivity中。

    

/**
* The Activity interface that is implemented by CordovaActivity.
* It is used to isolate plugin development, and remove dependency on entire Cordova library.
*/
public interface CordovaInterface { /**
* Launch an activity for which you would like a result when it finished. When this activity exits,
* your onActivityResult() method will be called.
*
* @param command The command object
* @param intent The intent to start
* @param requestCode The request code that is passed to callback to identify the activity
*/
abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode); /**
* Set the plugin to be called when a sub-activity exits.
*
* @param plugin The plugin on which onActivityResult is to be called
*/
abstract public void setActivityResultCallback(CordovaPlugin plugin); /**
* Get the Android activity.
*
* @return the Activity
*/
public abstract Activity getActivity(); /**
* Called when a message is sent to plugin.
*
* @param id The message id
* @param data The message data
* @return Object or null
*/
public Object onMessage(String id, Object data); /**
* Returns a shared thread pool that can be used for background tasks.
*/
public ExecutorService getThreadPool();
}
  • CordovaActivity核心类分析

       CordovaActivity是Cordova应用的入口类,用户用来载入html页面的Activity须要继承这个Activity。

CordovaActivity会读取Cordova配置文件res/xml/config.xml中的配置。

       CordovaActivity继承了Android Activity,实现了CordovaInterface接口。

       比較重要的成员变量有CordovaWebView appView。CordovaWebViewClient webViewClient,用Executors.newCachedThreadPool()初始化了一个线程池threadPool。创建了Activity返回时的回掉插件activityResultCallback,还有就是启动画面splashscreen的一些变量等。CordovaActivity继承了Activity,因此的它的生命周期和Activity一样,我们能够依照Activity生命周期的顺序開始看代码。

     首先看OnCreate方法,首先调用了Config.init(this)方法。读取config.xml文件初始化配置,看Config.java的源代码能够知道,该方法主要初始化了url白名单,背景颜色,是否全屏,载入页面超时时间(默认20s)。启动画面延时(默认3s)等。然后是读取Intent Extra中等一些參数,设置是否显示标题,是否全屏等。

接下来是读取屏幕宽度和高度。创建一个LinearLayoutSoftKeyboardDetect。

LinearLayoutSoftKeyboardDetect这个类是用来检測软键盘是否弹出的。主要是重写了onMeasure方法,当软键盘弹出。高度发生变化时发送
app.appView.sendJavascript(“cordova.fireDocumentEvent(‘hidekeyboard’);")事件。我们自己的cordova应用在又一次onCreate方法时会依次调用以下的方法。 

        super.onCreate(savedInstanceState);
super.init();
// Set by <content src="index.html" /> in config.xml
super.loadUrl(Config.getStartUrl());

 CordovaActivity类UML图

   

        onResume方法首先又一次调用了Config.init(this)方法,然后推断是否是第一次启动,假设是则直接返回,否则会调用appView.handleResume方法。该方法会触发javascript事件cordova.fireDocumentEvent(‘resume’),并通知pluginManager,最后进行计数。

       onPause方法比較简单,当appView不为空时调用appView.handlePause方法,然后去掉启动画面SplashScreen。

       onDestroy。onNewIntent,postMessage。sendJavascript,showWebPage方法的实现也和onPause方法相似,都是调用了appView的相关方法。

      方法addService(String serviceType, String className) 用来加入Service,这种方法已经降级了,以后应该在res/xml/plugins.xml文件加入。

      startActivityForResult方法首先给回调对象activityResultCallback赋值,设置activityResultKeepRunning,最后调用Activity的startActivityForResult方法。

      onActivityResult方法当启动的Activity返回结果时会被调用。首先调用了Activity的onActivityResult方法获得数据。接着调用mUploadMessage.onReceiveValue(result)。最后通过调用activityResultCallback的onActivityResult方法,通知Cordova插件。

       onReceivedError方法负责当发生不可恢复的错误时。显示提前定义的出错页面或错误信息。不可恢复的错误是指比如主要资源文件不可用等。

假设配置了错误页面,会在UI线程停止进度条,调用appView.showWebPage方法显示错误页面。否则调用displayError方法弹出错误描写叙述对话框。

      onCreateOptionsMenu,onPrepareOptionsMenu,onOptionsItemSelected这几个方法相似。都是先调用postMessage发送相应的事件,然后调用父类Activity的相应方法。

      onKeyUp和onKeyDown方法都是先调用appView的相关方法,然后调用Activity的相关方法。

      本系列第一篇文章先这样吧。明天下篇文章分析CordovaResourceApi。CordovaWebView。CordovaWebViewClient等几个类。

Cordova Android源代码分析系列一(项目总览和CordovaActivity分析)的更多相关文章

  1. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  2. 【Spring源码分析系列】ApplicationContext 相关接口架构分析

    [原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...

  3. 源码分析系列1:HashMap源码分析(基于JDK1.8)

    1.HashMap的底层实现图示 如上图所示: HashMap底层是由  数组+(链表)+(红黑树) 组成,每个存储在HashMap中的键值对都存放在一个Node节点之中,其中包含了Key-Value ...

  4. Android源代码之Gallery专题研究(1)

    前言 时光飞逝,从事Android系统开发已经两年了,总想写点什么来安慰自己.思考了非常久总是无法下笔,认为没什么好写的.如今最终决定写一些符合大多数人需求的东西,想必使用过Android手机的人们一 ...

  5. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  6. jquery2源码分析系列

    学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中 ...

  7. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

  8. jQuery源码分析系列(转载来源Aaron.)

    声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...

  9. jQuery源码分析系列——来自Aaron

    jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...

随机推荐

  1. Centos7环境下 安装ffmage2.7.1过程

    参考http://trac.ffmpeg.org/wiki/CompilationGuide/Centos#FFmpeg 先查看了官方文档,消化以后,开始自己编译ffmage2.7.1,所需要安装包, ...

  2. SSIS教程:创建简单的ETL包 -- 6. 对项目部署模型使用参数(Using Parameters with the Project Deployment Model)

    在本课中,将修改在第 5 课: 添加包部署模型的包配置中创建的包,以便使用项目部署模型.您将使用一个参数替换该配置值,以便指定示例数据位置.还可以复制本教程附带的已完成的 Lesson 5 包. 使用 ...

  3. centos 安装cloud foundry CLI

    步骤: 1.wget -O /etc/yum.repos.d/cloudfoundry-cli.repo https://packages.cloudfoundry.org/fedora/cloudf ...

  4. OpenStack IceHouse 部署 - 5 - 网络节点部署

    Neutron网络服务(网络节点)     目录 [隐藏]  1 参考 2 前置工作 2.1 调整内核参数 3 安装 4 配置 4.1 keystone对接 4.2 rabbitmq对接 4.3 me ...

  5. JavaScript的进阶之路(五)理解数组2

    数组方法 //定义一个测试数组 var array1 = [1,2,5,null,"a"]; //join()方法是String.split()方法的逆操作,后者是将字符串分割成若 ...

  6. 解决chrome提示您的连接不是私密连接的方法

    升级到最新的chrome , 开始报开发环境的证书错误问题 升级前,至少还有个可以添加例外,这个挺爽, 都不给设置. 网上找了找,有个解决方式         将选项卡切换至“快捷方式”栏,在目标的最 ...

  7. redis在windows上安装+RedisDesktopManager

    redis我就不在这里介绍了,这里直接介绍windows安装redis服务,网上有很多介绍windows版,我这边安装的是一个极简版的. redis官方下载地址:https://redis.io/do ...

  8. Python 生成器总结

    生成器的概念: 生成器不会把结果保存在一个系列中,而是保存在生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束 生成器是这样一个函数,它记住上一次返回时在函数体中的位 ...

  9. 将eChart图片利用POI导出到Excel

    在使用POI进行将数据导出到Excel时, 若要将eChart在前端生成的统计图(如柱状图.折线图.饼图等)一并导出,使用POI在后台构建数据图比较复杂,因此我选择将eChart在前端的统计图的bas ...

  10. ls 操作命令 -l/-R和rm -r dir 功能实现

    ls -R #include <sys/stat.h> #include <dirent.h> #include <fcntl.h> #include <st ...