天天看點

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的依賴使用。

系列文章

Android元件化開發實踐(一):為什麼要進行元件化開發? Android元件化開發實踐(二):元件化架構設計 Android元件化開發實踐(三):元件開發規範 Android元件化開發實踐(四):元件間通信問題 Android元件化開發實踐(五):元件生命周期管理 Android元件化開發實踐(六):老項目實施元件化 Android元件化開發實踐(七):開發常見問題及解決方案 Android元件化開發實踐(八):元件生命周期如何實作自動注冊管理 Android元件化開發實踐(九):自定義Gradle插件