每個Android應用啟動時,都會先創(chuàng)建一個Application。通常在Application里我們會做一些應用初始化的操作哟绊,常見的有第三方SDK初始化铜跑。在應用組件化之后门怪,組件與殼工程是隔離開來的,但是組件有時候也需要獲取應用的Application锅纺,也需要在應用啟動時進行初始化掷空。這就涉及到組件的生命周期管理問題。
1. 抽象出一個類似Application的類
首先囤锉,我們定義一個類似Application的抽象類出來坦弟,它模擬了Application的幾個主要方法:
public abstract class BaseAppLike {
public static final int MAX_PRIORITY = 10;
public static final int MIN_PRIORITY = 1;
public static final int NORM_PRIORITY = 5;
/**
* 返回組件的優(yōu)先級,優(yōu)先級范圍為[1-10]官地,10為最高酿傍,1為最低,默認優(yōu)先級是5
*
* @return
*/
public int getPriority() {
return NORM_PRIORITY;
}
/**
* 應用初始化
*
* @param context
*/
public abstract void onCreate(Context context);
public abstract void onTerminate();
}
2. 組件內(nèi)繼承實現(xiàn)BaseAppLike類
在組件內(nèi)實現(xiàn)一個繼承BaseAppLike的類驱入,我們把這個類當做是組件的Application容器赤炒。這里的onCreate()等同于Application的onCreate()方法,組件可以在這里獲取Application實例沧侥、執(zhí)行啟動初始化等操作可霎,也可以在這里設置保存一些全局性的數(shù)據(jù)等。
3. 怎么管理組件的生命周期
假設我們有組件ModuleA宴杀、ModuleB癣朗、ModuleC,這3個組件內(nèi)分別有ModuleAAppLike旺罢、ModuleBAppLike旷余、ModuleCAppLike,那么我們在殼工程集成時扁达,怎么去組裝他們呢正卧。最簡單的辦法是,在殼工程的Application.onCreate()方法里執(zhí)行:
@Override
public void onCreate() {
super.onCreate();
ModuleAAppLike moduleA = new ModuleAAppLike();
ModuleBAppLike moduleB = new ModuleBAppLike();
ModuleCAppLike moduleC = new ModuleCAppLike();
moduleA.onCreate(this);
moduleB.onCreate(this);
moduleC.onCreate(this);
}
有多少個組件跪解,就得手動構造多少個BaseAppLike炉旷,并執(zhí)行它的onCreate()方法。看起來貌似很簡單窘行,根本沒什么技術含量饥追,但是實際運用時,你會發(fā)現(xiàn)很多問題罐盔,接下來講講我碰到的問題但绕。
3.1 組件初始化的先后順序
前面介紹過,上層業(yè)務組件是依賴下層業(yè)務組件的惶看,如果下層組件在應用啟動時也需要初始化捏顺,那么我們在加載組件時,必然要先加載下層組件纬黎,否則加載上層組件時可能會出現(xiàn)問題幅骄。但是組件這么多,我們怎么確定要先加載誰后加載誰呢莹桅,當然你可以手動維護昌执,代碼里寫死,但是當業(yè)務越來越多诈泼、時間越來越久懂拾,肯定不靈活,你新加一個業(yè)務組件進來铐达,你都需要確定組件初始化先后順序岖赋。所以,我們必須有個機制來確定組件初始化先后順序瓮孙。
類似線程優(yōu)先級一樣唐断, 為每個組件定義了一個優(yōu)先級,通過重寫getPriority()方法可以設置組件的優(yōu)先級杭抠。優(yōu)先級范圍從[1-10]脸甘,默認優(yōu)先級都為5,下層組件或需要先初始化的組件偏灿,優(yōu)先級設置高一點丹诀。這樣我們在加載組件的時候,先對所有組件的優(yōu)先級進行排序翁垂,優(yōu)先級高的排前面铆遭,然后再按順序進行加載組件,就可解決這個問題了沿猜。
3.2 自動加載
前面這個示例枚荣,需要在殼工程代碼里,手動構建各個組件的BaseAppLike類啼肩。這樣問題又來了橄妆,如果很多個組件都有實現(xiàn)該類衙伶,那在集成時得一個一個找出這些類,并且新增加一個組件呼畸,你都有可能要去修改殼工程代碼痕支,這樣顯然是不靈活且不利于代碼維護的。如果能自動讀取并加載這些BaseAppLike類蛮原,那顯然是極好的,這里有2種方式來實現(xiàn):
- 在配置文件里定義
在殼工程的assets里放一個json配置文件另绩,定義了所有組件里BaseAppLike類的全路徑類名儒陨,應用啟動時讀取該配置文件,通過反射去加載并初始化組件笋籽。這種方式只需要修改配置文件即可蹦漠,實現(xiàn)起來比較簡單,但是還是不夠靈活车海。 - 通過注解配合APT來實現(xiàn)
APT是一種處理注解的工具笛园,它對源代碼文件進行檢測并找出其中的Annotation,使用Annotation進行額外的處理侍芝。所以可以考慮通過注解來標識所有組件內(nèi)的BaseAppLike類研铆,編譯時通過APT提取出來,這樣就可以做到自動識別并加載了州叠。
4. 小結
BaseAppLike類的設計目標棵红,首先是為了將整個應用的初始化動作分散到各個子組件內(nèi)部,子組件對外屏蔽內(nèi)部實現(xiàn)細節(jié)咧栗,方便組件的集成使用逆甜;其次是在每個組件內(nèi)部模擬Application類,以方便組件對Application的依賴使用致板。
系列文章
Android組件化開發(fā)實踐(一):為什么要進行組件化開發(fā)交煞?
Android組件化開發(fā)實踐(二):組件化架構設計
Android組件化開發(fā)實踐(三):組件開發(fā)規(guī)范
Android組件化開發(fā)實踐(四):組件間通信問題
Android組件化開發(fā)實踐(五):組件生命周期管理
Android組件化開發(fā)實踐(六):老項目實施組件化
Android組件化開發(fā)實踐(七):開發(fā)常見問題及解決方案
Android組件化開發(fā)實踐(八):組件生命周期如何實現(xiàn)自動注冊管理
Android組件化開發(fā)實踐(九):自定義Gradle插件
Android組件化開發(fā)實踐(十):通過Gradle插件統(tǒng)一規(guī)范