Android元件化開發實踐(五):元件生命週期管理
每個Android應用啟動時,都會先建立一個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; /** * 返回元件的優先順序,優先順序範圍為[1-10],10為最高,1為最低,預設優先順序是5 * * @return */ public int getPriority() { return NORM_PRIORITY; } /** * 應用初始化 * * @param context */ public abstract void onCreate(Context context); public abstract void onTerminate(); }
2. 元件內繼承實現BaseAppLike類
在元件內實現一個繼承BaseAppLike的類,我們把這個類當做是元件的Application容器。這裡的onCreate()等同於Application的onCreate()方法,元件可以在這裡獲取Application例項、執行啟動初始化等操作,也可以在這裡設定儲存一些全域性性的資料等。
3. 怎麼管理元件的生命週期
假設我們有元件ModuleA、ModuleB、ModuleC,這3個元件內分別有ModuleAAppLike、ModuleBAppLike、ModuleCAppLike,那麼我們在殼工程整合時,怎麼去組裝他們呢。最簡單的辦法是,在殼工程的Application.onCreate()方法裡執行:
@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,並執行它的onCreate()方法。看起來貌似很簡單,根本沒什麼技術含量,但是實際運用時,你會發現很多問題,接下來講講我碰到的問題。
3.1 元件初始化的先後順序
前面介紹過,上層業務元件是依賴下層業務元件的,如果下層元件在應用啟動時也需要初始化,那麼我們在載入元件時,必然要先載入下層元件,否則載入上層元件時可能會出現問題。但是元件這麼多,我們怎麼確定要先載入誰後加載誰呢,當然你可以手動維護,程式碼裡寫死,但是當業務越來越多、時間越來越久,肯定不靈活,你新加一個業務元件進來,你都需要確定元件初始化先後順序。所以,我們必須有個機制來確定元件初始化先後順序。
類似執行緒優先順序一樣, 為每個元件定義了一個優先順序,通過重寫getPriority() 方法可以設定元件的優先順序。優先順序範圍從[1-10],預設優先順序都為5,下層元件或需要先初始化的元件,優先順序設定高一點。這樣我們在載入元件的時候,先對所有元件的優先順序進行排序,優先順序高的排前面,然後再按順序進行載入元件,就可解決這個問題了。
3.2 自動載入
前面這個示例,需要在殼工程程式碼裡,手動構建各個元件的BaseAppLike類。這樣問題又來了,如果很多個元件都有實現該類,那在整合時得一個一個找出這些類,並且新增加一個元件,你都有可能要去修改殼工程程式碼,這樣顯然是不靈活且不利於程式碼維護的。如果能自動讀取並載入這些BaseAppLike類,那顯然是極好的,這裡有2種方式來實現:
-
在配置檔案裡定義
在殼工程的assets裡放一個json配置檔案,定義了所有元件裡BaseAppLike類的全路徑類名,應用啟動時讀取該配置檔案,通過反射去載入並初始化元件。這種方式只需要修改配置檔案即可,實現起來比較簡單,但是還是不夠靈活。 -
通過註解配合APT來實現
APT是一種處理註解的工具,它對原始碼檔案進行檢測並找出其中的Annotation,使用Annotation進行額外的處理。所以可以考慮通過註解來標識所有元件內的BaseAppLike類,編譯時通過APT提取出來,這樣就可以做到自動識別並載入了。
4. 小結
BaseAppLike類的設計目標,首先是為了將整個應用的初始化動作分散到各個子元件內部,子元件對外遮蔽內部實現細節,方便元件的整合使用;其次是在每個元件內部模擬Application類,以方便元件對Application的依賴使用。