Appcan Engine學(xué)習(xí)筆記之Engine初始化

本篇博客簡單的總結(jié)了 Appcan平臺中Engine的初始化過程纯出,博客中的代碼參考官方開源項(xiàng)目appcan-android,該篇文章已經(jīng)同步至ShaoYanCe的博客
甲葬。

平臺概述

Appcan什么耸成,可以用來做什么砌庄?

廣義上,AppCan是一套完整龐大的惫皱、云端一體的移動(dòng)PaaS平臺夷都,擁有覆蓋移動(dòng)應(yīng)用全生命周期的產(chǎn)品體系眷唉,同時(shí)服務(wù)2D開發(fā)者(工具)、2B企業(yè)(移動(dòng)化囤官、數(shù)字化)冬阳、2G政府(雙創(chuàng))。

技術(shù)原理
AppCan是基于HTML5技術(shù)的Hybird跨平臺移動(dòng)應(yīng)用開發(fā)工具党饮。

開發(fā)者利用HTML5+CSS3+JavaScript技術(shù)肝陪,通過AppCan IDE集成開發(fā)系統(tǒng)、云端打包器等劫谅,快速開發(fā)出Android见坑、iOS、WP平臺上的移動(dòng)應(yīng)用捏检。
平臺構(gòu)成

IDE工具:基于Eclipse定制的移動(dòng)集成開發(fā)環(huán)境荞驴。

應(yīng)用引擎:支持HTML5應(yīng)用運(yùn)行的支撐平臺。

插件API:擴(kuò)展方式贯城,原生能力熊楼,通過標(biāo)準(zhǔn)化接口調(diào)用。

JS SDK:對底層的接口進(jìn)行高級封裝的開發(fā)庫。

開放服務(wù):標(biāo)準(zhǔn)接口鲫骗,無限擴(kuò)展的互聯(lián)網(wǎng)能力犬耻。

UI框架:界面外觀,包括布局执泰、顏色枕磁、風(fēng)格等。

從官方文檔可以知道Appcan是一個(gè)移動(dòng)應(yīng)用開發(fā)平臺术吝,用它可以實(shí)現(xiàn)移動(dòng)應(yīng)用的混合開發(fā)计济。使用該平臺提供的ide開發(fā)HTML5應(yīng)用(也稱為微應(yīng)用),然后將代碼發(fā)送到云端打包服務(wù)器(也可以使用本地編譯打包)排苍,通過服務(wù)器打包腳本來打包生成apk沦寂,下方圖片是Appcan的平臺構(gòu)成(摘自官方)。

image

應(yīng)用引擎(Engine)是支持HTML5應(yīng)用(微應(yīng)用)運(yùn)行的支撐平臺淘衙,負(fù)責(zé)原生和h5 之間的交互传藏,屬于一個(gè)比較重要的組件,這篇博客首先學(xué)習(xí)一下Engine的初始化彤守。

Engine的初始化

Engine的初始化方法initSync一般在Application的onCreat()中進(jìn)行調(diào)用毯侦,初始化的方式有同步和異步兩種。

  public void onCreate() {
        super.onCreate();
        AppCan.getInstance().initSync(this.getApplicationContext());//有些插件需要在別的進(jìn)程初始化,因此最好在Application.onCreate()里面初始化引擎,或者將反射調(diào)用部分抽離出來
    }

異步初始化

異步初始化主要是開啟了一個(gè)子線程遗增,在子線程中調(diào)用同步初始化方法進(jìn)行初始化叫惊。

    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中調(diào)用款青,該類是一個(gè)單例做修,初始化具體代碼如下:


    public boolean initSync(Context context){
        mContext=context.getApplicationContext();
        //如果context不是全局上下就返回false
        if (!(mContext instanceof Application)){
            return false;
        }
        //創(chuàng)建一個(gè)EngineEventListener添加到監(jiān)聽Engine推送事件的隊(duì)列中
        mListenerQueue = new ELinkedList<EngineEventListener>();
        PushEngineEventListener pushlistener = new PushEngineEventListener();
        mListenerQueue.add(pushlistener);
        BDebug.init(); //log工具類
        BConstant.app = (Application) mContext; //將應(yīng)用的上下文賦值給BConstant(專門用來存放常量)的app屬性,方便使用
        DiskCache.initDiskCache(mContext);//???
        ACEDes.setContext(mContext); // ACEDes 主要負(fù)責(zé)加密
        EUExUtil.init(mContext);//EUExUtil初始化抡草,EUExUtil主要用來反射獲取布局文件饰及,以及布局文件中的一些屬性
        WebViewSdkCompat.initInApplication(mContext);//???
        mCrashReport = ECrashHandler.getInstance(mContext); //??? 捕獲崩潰日志
        initPlugin();// 第三方插件的初始化
        //清除上次運(yùn)行的Session 數(shù)據(jù)
        SpManager.getInstance().clearSession();

        //獲取assets/widget 中的widget,assets的widget中沒有config.xml則獲取默認(rèn)的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;
        }

從上邊的初始化代碼可以總結(jié)出Engine在初始化的工程中主要做了以下事情:

  1. 創(chuàng)建一個(gè)隊(duì)列屏箍,該隊(duì)列中存放了EngineEventListener,主要用來監(jiān)聽Engine中窗口的打開橘忱,關(guān)閉等事件赴魁,在初始化的時(shí)候先創(chuàng)建了一個(gè)pushlistener(推送相關(guān)),放入到該隊(duì)列中钝诚。
  2. 日志工具類BDebug的初始化
  3. 將應(yīng)用的上下文mContext賦值給BConstant的app屬性(這點(diǎn)比較巧妙颖御,以后使用mContext的時(shí)候就比較方便)
  4. 負(fù)責(zé)加密的工具類ACEDes 初始化
  5. EUExUtil初始化 : 主要負(fù)責(zé)反射獲取布局文件以及文件中的屬性
  6. WebViewSdkCompat的初始化(具體作用待研究???)
  7. ECrashHandler : 捕獲Engine崩潰的類
  8. <font color="green">初始化第三方插件 , 這個(gè)比較重要<font>
  9. 通過SpManager清楚上次運(yùn)行的session
  10. 判斷Engine是否初始化成功
    判斷的標(biāo)準(zhǔn)就是:mWidgetData != null && m_indexUrl!=null
  11. 攔截application聲明周期中的onApplicationCreate()
  12. DiskCache 的初始化(具體作用有待研究)

*** 博客編號: 22 ***

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凝颇,一起剝皮案震驚了整個(gè)濱河市潘拱,隨后出現(xiàn)的幾起案子疹鳄,更是在濱河造成了極大的恐慌,老刑警劉巖芦岂,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪弓,死亡現(xiàn)場離奇詭異,居然都是意外死亡禽最,警方通過查閱死者的電腦和手機(jī)杠茬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弛随,“玉大人瓢喉,你說我怎么就攤上這事∫ㄍ福” “怎么了栓票?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愕够。 經(jīng)常有香客問我走贪,道長,這世上最難降的妖魔是什么惑芭? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任坠狡,我火速辦了婚禮,結(jié)果婚禮上遂跟,老公的妹妹穿的比我還像新娘逃沿。我一直安慰自己,他們只是感情好幻锁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布凯亮。 她就那樣靜靜地躺著,像睡著了一般哄尔。 火紅的嫁衣襯著肌膚如雪假消。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天岭接,我揣著相機(jī)與錄音富拗,去河邊找鬼。 笑死鸣戴,一個(gè)胖子當(dāng)著我的面吹牛啃沪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葵擎,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谅阿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起签餐,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寓涨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氯檐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒良,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年冠摄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糯崎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡河泳,死狀恐怖沃呢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拆挥,我是刑警寧澤薄霜,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站纸兔,受9級特大地震影響惰瓜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汉矿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一崎坊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洲拇,春花似錦奈揍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚕捉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柴淘,已是汗流浹背迫淹。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留为严,地道東北人敛熬。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像第股,于是被迫代替她去往敵國和親应民。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,866評論 0 5
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫诲锹、插件繁仁、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 國慶節(jié)前夜!一身作訓(xùn)服 归园,帶著耳機(jī) 黄虱,開始奔跑,9點(diǎn)不到庸诱,氣溫大概1678度吧捻浦,百靈公園沒人夜跑了,溜達(dá)到...
    過不成客閱讀 149評論 0 0
  • 01 一個(gè)陰著天的下午桥爽,我和往常一樣在上完枯燥的課以后去跑步朱灿,因?yàn)閷W(xué)校要求這樣,可我更喜歡窩在教室的角落想一些事情...
    余珂閱讀 284評論 13 3
  • 事件:昨孩子晨起匆忙洗漱后開始吃早餐钠四,坐在一旁的我一邊給她剝玉米一邊催促著她快些吃母剥,希望她能把早餐吃完又不耽擱上學(xué)...
    俠骨丹心9號閱讀 197評論 0 1