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