2017-05-30 31 views
1

我想實現我的Android應用新的即時應用功能。我有4個模塊組成:base 即時應用程序:使用從基礎模塊的功能模塊沒有很強的依賴性

  • 功能模塊與推送通知的類::push
  • 安裝的應用模塊:installed
  • 即時應用模塊:instant
  • 與所有的活動和邏輯

    • 基體特徵模塊

    由於即時應用程序不支持推送通知,我想要只啓用push模塊我已安裝的應用程序。但我已在base中共享類,這些類調用push方法。例如,我在應用程序類中的應用程序啓動期間初始化push模塊。

    如何組織依賴關係,因此我不必將push模塊包含到base模塊,但能夠從base調用push方法?我有一個想法,我可以在base模塊創建界面PushManagerProvider所以instantinstalled可以提供自己的實現,但我不知道我怎麼能注入的具體實施base根據當前的模塊。

    回答

    2

    假設你使用匕首和您在您的應用程序類建立一個單獨組件,這裏有一個方法。

    base中,定義您的@Component類所擴展的接口Injector。讓您的應用程序在您的基本模塊中實現一個InjectorProvider界面,該界面有一個返回構造組件的單一方法getInjector()。該組件將使用提供無操​​作模塊PushManagerProvider的模塊構建。

    然後你push模塊中,創建一個替代實現你的Application類(擴大你的基地,並重新命名爲PushAwareApplication?)這就產生了用匕首模塊,提供一個合法PushManagerProvider,並使用merge rules強制使用新的部件PushAwareApplication當你的應用程序模塊內置了push時的名字。

    這樣,您就可以撥打

    ((InjectorProvider)getApplication()).getInjector().inject(this); 
    

    並獲得取決於你是否內置了可安裝應用程序或即時應用不同的組件實現。

    有可能與匕首這樣做的更正確的方式,但這應該讓你開始。

    如果你不使用匕首,可以使用與實施,提供了一個「getPushManagerProvider()`方法的界面二者的應用實現如上所述的相同的應用覆蓋技術。

    相關問題