Appcan Engine学习笔记之Engine初始化

本篇博客简单的总结了 Appcan平台中Engine的初始化过程,博客中的代码参考官方开源项目appcan-android,该篇文章已经同步至ShaoYanCe的博客

平台概述

Appcan什么,可以用来做什么?

广义上,AppCan是一套完整庞大的、云端一体的移动PaaS平台,拥有覆盖移动应用全生命周期的产品体系,同时服务2D开发者(工具)、2B企业(移动化、数字化)、2G政府(双创)。

技术原理
AppCan是基于HTML5技术的Hybird跨平台移动应用开发工具。

开发者利用HTML5+CSS3+JavaScript技术,通过AppCan IDE集成开发系统、云端打包器等,快速开发出Android、iOS、WP平台上的移动应用。
平台构成

IDE工具:基于Eclipse定制的移动集成开发环境。

应用引擎:支持HTML5应用运行的支撑平台。

插件API:扩展方式,原生能力,通过标准化接口调用。

JS SDK:对底层的接口进行高级封装的开发库。

开放服务:标准接口,无限扩展的互联网能力。

UI框架:界面外观,包括布局、颜色、风格等。

从官方文档可以知道Appcan是一个移动应用开发平台,用它可以实现移动应用的混合开发。使用该平台提供的ide开发HTML5应用(也称为微应用),然后将代码发送到云端打包服务器(也可以使用本地编译打包),通过服务器打包脚本来打包生成apk,下方图片是Appcan的平台构成(摘自官方)。

image

应用引擎(Engine)是支持HTML5应用(微应用)运行的支撑平台,负责原生和h5 之间的交互,属于一个比较重要的组件,这篇博客首先学习一下Engine的初始化。

Engine的初始化

Engine的初始化方法initSync一般在Application的onCreat()中进行调用,初始化的方式有同步和异步两种。

  public void onCreate() {
        super.onCreate();
        AppCan.getInstance().initSync(this.getApplicationContext());//有些插件需要在别的进程初始化,因此最好在Application.onCreate()里面初始化引擎,或者将反射调用部分抽离出来
    }

异步初始化

异步初始化主要是开启了一个子线程,在子线程中调用同步初始化方法进行初始化。

    public void init(final Context context, final OnAppCanInitListener initListener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean result=initSync(context);
            }
        }).start();
    }

同步初始化

Engine同步初始化的方法为initSync(), 在类AppCan中调用,该类是一个单例,初始化具体代码如下:


    public boolean initSync(Context context){
        mContext=context.getApplicationContext();
        //如果context不是全局上下就返回false
        if (!(mContext instanceof Application)){
            return false;
        }
        //创建一个EngineEventListener添加到监听Engine推送事件的队列中
        mListenerQueue = new ELinkedList<EngineEventListener>();
        PushEngineEventListener pushlistener = new PushEngineEventListener();
        mListenerQueue.add(pushlistener);
        BDebug.init(); //log工具类
        BConstant.app = (Application) mContext; //将应用的上下文赋值给BConstant(专门用来存放常量)的app属性,方便使用
        DiskCache.initDiskCache(mContext);//???
        ACEDes.setContext(mContext); // ACEDes 主要负责加密
        EUExUtil.init(mContext);//EUExUtil初始化,EUExUtil主要用来反射获取布局文件,以及布局文件中的一些属性
        WebViewSdkCompat.initInApplication(mContext);//???
        mCrashReport = ECrashHandler.getInstance(mContext); //??? 捕获崩溃日志
        initPlugin();// 第三方插件的初始化
        //清除上次运行的Session 数据
        SpManager.getInstance().clearSession();

        //获取assets/widget 中的widget,assets的widget中没有config.xml则获取默认的widget
        //mWidgetData != null并且它的m_indexUrl不为null则说明Engine初始化完成
        WDataManager wDataManager = new WDataManager(mContext);
        if (wDataManager.isHasAssetsWidget()) {
            mWidgetData = wDataManager.getWidgetData();
        } else {
            mWidgetData = wDataManager.getDefaultWidgetData();
        }
        boolean success=isInitSuccess();

        //BUtility???
        if (success) {
            BUtility.initWidgetOneFile(mContext, mWidgetData.m_appId);
        }

        //拦截application生命周期中的onApplicationCreate()
        reflectionPluginMethod("onApplicationCreate");

        return success;
        }

从上边的初始化代码可以总结出Engine在初始化的工程中主要做了以下事情:

  1. 创建一个队列,该队列中存放了EngineEventListener,主要用来监听Engine中窗口的打开,关闭等事件,在初始化的时候先创建了一个pushlistener(推送相关),放入到该队列中。
  2. 日志工具类BDebug的初始化
  3. 将应用的上下文mContext赋值给BConstant的app属性(这点比较巧妙,以后使用mContext的时候就比较方便)
  4. 负责加密的工具类ACEDes 初始化
  5. EUExUtil初始化 : 主要负责反射获取布局文件以及文件中的属性
  6. WebViewSdkCompat的初始化(具体作用待研究???)
  7. ECrashHandler : 捕获Engine崩溃的类
  8. <font color="green">初始化第三方插件 , 这个比较重要<font>
  9. 通过SpManager清楚上次运行的session
  10. 判断Engine是否初始化成功
    判断的标准就是:mWidgetData != null && m_indexUrl!=null
  11. 拦截application声明周期中的onApplicationCreate()
  12. DiskCache 的初始化(具体作用有待研究)

*** 博客编号: 22 ***

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 国庆节前夜!一身作训服 ,带着耳机 ,开始奔跑,9点不到,气温大概1678度吧,百灵公园没人夜跑了,溜达到...
    过不成客阅读 147评论 0 0
  • 01 一个阴着天的下午,我和往常一样在上完枯燥的课以后去跑步,因为学校要求这样,可我更喜欢窝在教室的角落想一些事情...
    余珂阅读 266评论 13 3
  • 事件:昨孩子晨起匆忙洗漱后开始吃早餐,坐在一旁的我一边给她剥玉米一边催促着她快些吃,希望她能把早餐吃完又不耽搁上学...
    侠骨丹心9号阅读 190评论 0 1