2013-10-12 67 views
1

我有一個產品風味的應用程序,基本上是單個應用程序的白色標籤。然而,偶爾會有一些與主流有些分歧,因爲客戶想要的東西略有不同。 到目前爲止,我們一直在編輯這些案例的代碼,並使用意大利麪代碼(大量的ifs和elses)來確保其他應用程序不會中斷。毋庸置疑,這不是一個可擴展的(甚至是理智的)方法。Android自定義產品風味工作流程

一種選擇是寫在活動課中productFlavor源文件夾,即src/flavor1/java/AnActivity.javasrc/flavor2/java/AnActivity.java等 由於productFlavor代碼不能覆蓋src/main類,這將需要被複製爲每個新的相同的類即使沒有定製的味道。我不太喜歡這個選項。它導致了很多冗餘的代碼和類名變得不那麼具有描述性,因爲它們都必須具有相同的名稱才能覆蓋其他名稱,即使它們可能做了不同的事情。

另一種選擇是使用類似Dagger的東西來構建ObjectGraph併爲不同的實現注入Intents。例如,如果它是flavor1,則單擊按鈕X時,將注入ActivityA的意圖,如果它是flavor2,則注入ActivityB的意圖。

這似乎是一個更好的方法來做到這一點,但我仍然不知道如何實現將覆蓋默認ObjectGraph中的綁定的類。

關於實現或其他選項的任何想法?我沒有被綁定到Dagger,我剛剛開始研究依賴注入和測試,以便其他框架也能正常工作。

回答

5

這是我做的......

src/flavor1/java/com/myapp/Modules.java

public class Modules { 
    public static Object[] get(Application app) { 
    return new Object[] { 
     new MyAppModule(app), 
     new Flavor1Module(app) 
    }; 
    } 
} 

src/flavor2/java/com/myapp/Modules.java

public class Modules { 
    public static Object[] get(Application app) { 
    return new Object[] { 
     new MyAppModule(app), 
     new Flavor2Module(app) 
    }; 
    } 
} 

src/main/java/com/myapp/MyAppApplication.java

ObjectGraph og = ObjectGraph.create(Modules.get(this)); 

MyAppModule有共同的依賴關係。如果是overrides=trueFlavor1ModuleFlavor2Module可以貢獻附加依賴關係或覆蓋來自MyAppModule的附加依賴關係。

+0

Booyah!那樣做了...我開始愛上'Dagger' –

+0

哦..只是另一個有點相關的觀點。如果有對公共依賴關係的重寫,是否會影響測試中的任何重寫。換句話說,覆蓋是否可以被覆蓋? –

+0

實際上我不確定。我不知道這是如何處理的。我傾向於說最後一個模塊贏了(因爲它們是有序的),但我必須深入研究。在依靠這種行爲之前在本地進行實驗! –