加載框架與定制
mPaaS Android 框架提供了一整套的加載邏輯。基于此框架,研發(fā)團(tuán)隊(duì)可以進(jìn)行多業(yè)務(wù)線開發(fā)。本文描述框架的啟動(dòng)流程以及如何在框架下添加自己的代碼以對(duì)接啟動(dòng)。
啟動(dòng)流程
Application
傳統(tǒng) Android apk 運(yùn)行時(shí)首先加載 AndroidManifest
文件 application
節(jié)點(diǎn)中 android:name
配置的 Application。
由于 mPaaS Android 框架重寫了加載流程, android:name
中配置 mPaaS Android 框架的 com.alipay.mobile.quinox.LauncherApplication
類。
<application
android:name="com.alipay.mobile.quinox.LauncherApplication"
android:allowBackup="true"
android:debuggable="true"
android:hardwareAccelerated="false"
android:icon="@drawable/appicon"
android:label="@string/name"
android:theme="@style/AppThemeNew" >
</application>
啟動(dòng)頁
由于框架加載 bundle 可能會(huì)比較耗時(shí),因此需要一個(gè)啟動(dòng)頁等待框架啟動(dòng)完成之后再跳轉(zhuǎn)到程序主頁,所以在 AndroidManifest
文件中配置了框架提供的 com.alipay.mobile.quinox.LauncherActivity
應(yīng)用啟動(dòng)頁。
配置如下:
<activity
android:name="com.alipay.mobile.quinox.LauncherActivity"
android:configChanges="orientation | keyboardHidden | navigation"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
為方便開發(fā)人員對(duì)啟動(dòng)過程的理解,也為了避免啟動(dòng)過程被誤改誤刪、被干擾,mPaaS 的啟動(dòng)過程被適度封裝。因此,上述的 LauncherApplication
和 LauncherActivity
對(duì)開發(fā)人員完全不可見。
為了讓客戶端 App 在啟動(dòng)過程中實(shí)現(xiàn)自身的初始化邏輯,mPaaS 設(shè)計(jì)了 LauncherApplicationAgent
和 LauncherActivityAgent
代理。作為開發(fā)人員,您可以通過繼承這兩個(gè)類,在相應(yīng)的回調(diào)中實(shí)現(xiàn)自身的初始化邏輯。當(dāng)您在 bundle 工程中定義了這兩個(gè)類時(shí),在使用 ProGuard 進(jìn)行代碼混淆的時(shí)候則需要對(duì)這兩個(gè)類進(jìn)行防混淆設(shè)置,詳情請(qǐng)參見 混淆 Android 文件。
啟動(dòng)流程圖
mPaaS Android 框架加載流程如下:
框架啟動(dòng)后主線程會(huì)創(chuàng)建啟動(dòng)頁
LauncherActivity
,然后回調(diào)LauncherActivityAgent
的preInit
方法。框架進(jìn)行 multidex。過程中會(huì)回調(diào)
LauncherApplicationAgent
的preInit
方法,讀取當(dāng)前.apk
中每個(gè) bundle 的描述文件,并對(duì)每個(gè) bundle 創(chuàng)建對(duì)應(yīng)的類加載器,加載其中的資源文件。初始化完成后,回調(diào)
LauncherActivityAgent
和LauncherApplicationAgent
的postInit
方法。
定制
實(shí)際上,框架已在 Launcher 工程中自動(dòng)創(chuàng)建了兩個(gè)類 MockLauncherApplicationAgent
和 MockLauncherActivityAgent
繼承了 LauncherApplicationAgent
和 LauncherActivityAgent
這兩個(gè)回調(diào)接口。在框架的初始化過程中,它們分別在 LauncherAppliction
和 LauncherActivity
中被調(diào)用。
在 Portal 的 AndroidManifest.xml
中配置如下。開發(fā)人員也可在 Bundle 中實(shí)現(xiàn)這兩個(gè)代理類,在以上配置中修改對(duì)應(yīng) meta-data
的 value
值:
<application
android:name="com.alipay.mobile.quinox.LauncherApplication" >
<!-- Application 的回調(diào)配置 -->
<meta-data
android:name="agent.application"
android:value="com.mpaas.demo.launcher.framework.MockLauncherApplicationAgent"/>
<!-- Activity 的回調(diào)配置 -->
<meta-data
android:name="agent.activity"
android:value="com.mpaas.demo.launcher.framework.MockLauncherActivityAgent"/>
<!-- 啟動(dòng)頁的布局配置 -->
<meta-data
android:name="agent.activity.layout"
android:value="layout_splash"/>
</application>
代理類
agent.application
配置的是啟動(dòng)過程代理 ApplicationAgent
,如下所示:
public class MockLauncherApplicationAgent extends LauncherApplicationAgent {
@Override
protected void preInit() {
super.preInit();
//框架初始化前
}
@Override
protected void postInit() {
super.postInit();
//框架初始化后
}
}
客戶端 App 可以在 LauncherApplicationAgent
的實(shí)現(xiàn)類中,進(jìn)行一些 Application 級(jí)別的初始化工作。preInit()
回調(diào)發(fā)生在框架初始化之前,因此不要在這里調(diào)用框架(MicroApplicationContext
)的相關(guān)接口。而 postInit()
回調(diào)發(fā)生在框架初始化完成之后,是可以使用的。
agent.activity
配置的是啟動(dòng) Activity 的代理,如下所示:
public class MockLauncherActivityAgent extends LauncherActivityAgent {
@Override
public void preInit(Activity activity) {
super.preInit(activity);
//Launcher Activity 啟動(dòng)前
}
@Override
public void postInit(final Activity activity) {
super.postInit(activity);
//Launcher Activity 啟動(dòng)后
//跳轉(zhuǎn)程序首頁的邏輯
startActivity(activity,YOUR_ACTIVITY);
}
}
同上述的 LauncherApplicationAgent
類似,LauncherActivityAgent
的兩個(gè)回調(diào)也分別發(fā)生在框架初始化之前和之后,使用方法也類似。
修改啟動(dòng)頁布局
在 Portal 的 AndroidManifest.xml
中還配置了啟動(dòng)頁的布局文件,如下所示:
<application
android:name="com.alipay.mobile.quinox.LauncherApplication" >
<!-- 啟動(dòng)頁的布局配置 -->
<meta-data
android:name="agent.activity.layout"
android:value="layout_splash"/>
</application>
修改 value 值為自定義的布局文件名。
需要把布局文件和引用的相關(guān)資源放置在 Portal 工程里。