我有一个应用程序有很多产品口味,这些产品口味基本上是单个应用程序的白色标签。然而,偶尔,由于客户想要稍微不同的东西,所以在某些风格上会与主流有所不同。 到目前为止,我们一直在为这些案例编辑代码并使用意大利面条代码(大量的 ifs 和 elses)来确保其他应用程序不会中断。不用说,这不是一种非常可扩展(甚至理智)的方式来做到这一点。
一种选择是在 productFlavor 源文件夹中编写 Activity 类,即 src/flavor1/java/AnActivity.java
、src/flavor2/java/AnActivity.java
等
由于 productFlavor 代码无法覆盖 src/main
类,因此即使没有自定义,也需要为每种新口味复制相同的类。我不太喜欢这个选项。这会导致大量冗余代码和类名最终不再具有描述性,因为它们都必须具有相同的名称才能覆盖其他名称,即使它们可能在做一些不同的事情。
另一种选择可能是使用类似 Dagger
的东西来构建 ObjectGraph
并为不同的实现注入(inject) Intents。例如,如果它是 flavor1
,当点击按钮 X 时,一个 ActivityA
的 Intent 被注入(inject),如果它是 flavor2
,一个 的 Intent >ActivityB
被注入(inject)。
这似乎是一种更好的方法,但我仍然不确定如何实现将覆盖默认 ObjectGraph
中的绑定(bind)的类。
关于实现或其他选项的任何想法?我不受限于 Dagger
,我只是开始研究依赖注入(inject)和测试,以便其他框架也能正常工作。
最佳答案
这是我做的...
在 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=true
,Flavor1Module
和 Flavor2Module
可以贡献额外的依赖项或覆盖来自 MyAppModule
的依赖项。
关于Android 为产品口味定制工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329584/