Android組件化開發(fā)實踐(五):組件生命周期管理

每個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ī)范

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斟或,隨后出現(xiàn)的幾起案子素征,更是在濱河造成了極大的恐慌,老刑警劉巖缕粹,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚茅,死亡現(xiàn)場離奇詭異,居然都是意外死亡平斩,警方通過查閱死者的電腦和手機亚享,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绘面,“玉大人欺税,你說我怎么就攤上這事侈沪。” “怎么了晚凿?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵亭罪,是天一觀的道長。 經(jīng)常有香客問我歼秽,道長应役,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任燥筷,我火速辦了婚禮箩祥,結果婚禮上,老公的妹妹穿的比我還像新娘肆氓。我一直安慰自己袍祖,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布谢揪。 她就那樣靜靜地躺著蕉陋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拨扶。 梳的紋絲不亂的頭發(fā)上凳鬓,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音屈雄,去河邊找鬼村视。 笑死,一個胖子當著我的面吹牛酒奶,可吹牛的內(nèi)容都是我干的蚁孔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惋嚎,長吁一口氣:“原來是場噩夢啊……” “哼杠氢!你這毒婦竟也來了?” 一聲冷哼從身側響起另伍,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鼻百,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摆尝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温艇,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年堕汞,在試婚紗的時候發(fā)現(xiàn)自己被綠了勺爱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡讯检,死狀恐怖琐鲁,靈堂內(nèi)的尸體忽然破棺而出卫旱,到底是詐尸還是另有隱情,我是刑警寧澤围段,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布顾翼,位于F島的核電站,受9級特大地震影響奈泪,放射性物質發(fā)生泄漏适贸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一段磨、第九天 我趴在偏房一處隱蔽的房頂上張望取逾。 院中可真熱鬧,春花似錦苹支、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至究反,卻和暖如春寻定,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精耐。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工狼速, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卦停。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓向胡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惊完。 傳聞我的和親對象是個殘疾皇子僵芹,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,104評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料小槐? 從這篇文章中你...
    hw1212閱讀 12,723評論 2 59
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拇派,服務發(fā)現(xiàn),斷路器凿跳,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Android組件化項目地址:Android組件化項目AndroidModulePattern Android組件...
    半灬邊灬天閱讀 2,921評論 4 37
  • 快速排序(Quicksort)是對冒泡排序的一種改進件豌。快速排序由C. A. R. Hoare在1962年提出控嗜。它的...
    Jacinth閱讀 304評論 0 0