我有一个带有大量产品口味的应用程序,它们基本上是单个应用程序的白色标签。然而,偶尔会有一些与主流有所不同,因为客户想要的东西略有不同。 到目前为止,我们一直在编辑这些案例的代码并使用意大利面条代码(许多ifs和elses)来确保其他应用程序不会中断。毋庸置疑,这不是一种可扩展(甚至是理智)的方法。
一种选择是在productFlavor源文件夹中编写活动类,即src/flavor1/java/AnActivity.java
,src/flavor2/java/AnActivity.java
等。
由于productFlavor代码无法覆盖src/main
类,因此即使没有自定义,也需要为每个新的样式复制相同的类。我真的不太喜欢这个选项。它导致许多冗余代码和类名最终不再具有描述性,因为它们都必须具有相同的名称才能覆盖其他代码,即使它们可能正在做不同的事情。
另一种选择可能是使用Dagger
之类的东西来构建ObjectGraph
并为不同的实现注入Intent。例如,如果是flavor1
,则单击按钮X时会注入ActivityA
的意图,如果是flavor2
,则会注入ActivityB
的意图。
这似乎是一种更好的方法,但我仍然不确定如何实现会覆盖默认ObjectGraph
中绑定的类。
有关实施或其他选项的任何想法?我不一定要Dagger
,我只是开始研究依赖注入和测试,所以其他框架也能正常工作。
答案 0 :(得分: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
有共同的依赖关系。如果Flavor1Module
,Flavor2Module
和MyAppModule
可以提供额外的依赖关系或覆盖overrides=true
的依赖关系。