Cordova Android源代码分析系列一(项目总览和CordovaActivity分析)

摘要:
Cordova Android项目是Cordova安卓原生部分的Java代码实现。通过深入分析cordova Android源代码的实现。了解Cordova插件的工作原理,开发Cordova的插件以集成自己的功能模块。cordova 3.5版的Android核心框架共有27个java文件,因此代码量不大。它用于隔离Cordova插件开发,并隔离插件对Cordova核心库的直接依赖。详细信息在CordovaActivity中实现。CordovaActivity将读取Cordova配置文件res/xml/config.xml中的配置。CordovaActivity继承AndroidActivity并实现CordovaInterface接口。
版权声明:本文为博主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 Android源代码分析系列一(项目总览和CordovaActivity分析)第1张

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="http://t.zoukankan.com/index.html" /> in config.xml
        super.loadUrl(Config.getStartUrl());

Cordova Android源代码分析系列一(项目总览和CordovaActivity分析)第2张 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分析)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇异步线程池的实现(一)-------具体实现方法AIX 环境下动态路由下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

debian环境下 l7filter 的安装教程

debian环境下 l7-filter 的安装教程本文欢迎大家转载,请保留作者信息。请注明转自linuxsir.org,作者memory。l7-filter(Application Layer Packet Classifier for Linux)是linux下的开源项目,它是基于应用层数据识别的分类器。它可以分类数据包而不管你使用的是哪些端口,这对那些...

TFS源代码管理

一、服务器配置   1、创建一个Visual Studio Online账户 打开VS,选择团队资源管理器(视图菜单下),然后在团队资源管理器中选择注册Team Foundation Service,打开VS登录页面,如果有账号直接登录,如果没有注册一个就可以。     2、登录以后跳转到创建账户页面 输入各项信息,其中Account URL很重要,一定...

如何从github下载项目的源代码,包含git客户端,直接下载,vs下载

有好多小伙伴可能刚刚接触github,还不知道如果和github下载项目,此处写个博客统一的声明。从多种方式下载源代码,加深对git的理解。 首先先解释下git的含义,git是一个源代码的管理工具,通俗的解释,每当你保存一次,源代码项目就做了一个镜像,如果你保存了100次,就生成了一个镜像,以后的任意时间都可以恢复到之前的任意一个镜像,并且可以从镜像处开始...

文档源代码opencv 中的错误error: ‘SurfFeatureDetector’ was not declared in this scope

本篇文章朋友在青岛游玩的时候突然想到的...最近就有想写几篇关于文档源代码的文章,所以回家到之后就奋笔疾书的写出来发布了          这是文档中的源代码,:但是译编的时候会有一下错误:     error: ‘SurfFeatureDetector’ was not declared in this scope #include <stdio...

arcengine 开发经典帖 【强烈推荐仔细研读】

转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用:第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine的产品。第二部分:ArcEngine9.2的新特性及变化、(续)--类对比及变化、(续)--(代码转换插件)、(续)--ArcEngine新命令,工具、菜单...

android 4.1源码下载方法最新实例教程

1、安装repo ,执行命令如下: $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod +x ~/bin/repo 2、初始化 repo ,执行命令如下: $ repo init -u https://android.g...