Android设计/架构:从同一代码库创建不同的应用程序

3
我希望从同一代码库中创建两个应用程序,它们的颜色和一些数据来自后端不同。情况是这样的,假设我想创建应用程序App1和App2。两者都具有类似的流程。我能否:
  1. 如果是App1,则选择蓝色标题栏颜色,其他则为红色?
  2. 在代码中,如果(running App == App1) {执行此部分} 否则{其他部分}?
  3. 如果App是App1,则选择layout1.xml作为活动,否则选择layout2.xml?
我不确定如何处理这个问题。任何帮助都将不胜感激。
谢谢。

3
我猜你需要在Android Studio的Gradle构建系统中提供的产品口味设置。链接:https://developer.android.com/tools/building/configuring-gradle.html - Nishant Srivastava
2个回答

9
如果你正在使用Android Studio,则你所描述的是产品风味。引用文档:“产品风味定义了由项目构建的应用程序的定制版本。单个项目可以有不同的风味,从而改变生成的应用程序。” 对于本答案的目的,让我们假设您有一个具有两个产品风味flavorOneflavorTwo的项目。您的项目还将拥有三个源集:
  • src/main/,大多数文件都在这里
  • src/flavorOne/,其中包含一种风味的内容
  • src/flavorTwo/,其中包含另一种风味的内容
考虑到这一点...

如果App是App1,请选择蓝色(header),否则选择红色?

src/main/res/values/colors.xml中,定义名为header的颜色,并为其赋值蓝色。在src/flavorTwo/res/values/colors.xml中,定义名为header的颜色,并为其赋值红色。其余部分引用header颜色(例如,@color/headerR.color.header)。当您构建flavorOne时,将使用main颜色。当您构建flavorTwo时,flavorTwo值将覆盖main值。

如果App是App1,则选择layout1.xml活动,否则选择layout2.xml?

src/main/res/layout/thingy.xml中,定义您的默认布局实现。在src/flavorTwo/res/layout/thingy.xml中,定义您要用于flavorTwo的布局。您的Java代码将引用R.layout.thingy。当您构建flavorOne时,将使用main布局。当您构建flavorTwo时,flavorTwo布局将覆盖main布局。

在代码中,如果(正在运行)App=App1 {执行这部分} else{其他部分}?

这有点取决于您具有多少不同的代码。如果它是实质性的,您可以使用策略模式:
  • src/flavorOne/java/中有一个StuffStrategy的实现

  • src/flavorTwo/java/中有另一个StuffStrategy的实现

  • 在你的src/main/java代码中,引用StuffStrategy,根据你正在构建的flavor,它将引入正确的实现

如果代码变化真的很微小,你可以使用buildConfigField为一些新字段(例如STUFF)提供一个值,该值将根据flavor而变化,并添加到BuildConfig类中。 这个Stack Overflow答案显示了详细信息。


关于将这些应用程序上传到Play Store,我们需要有不同的包,那么我们可以将这两种风味作为两个不同的应用程序上传吗? - Sagar
1
@Sagar:当然。这正是整个重点所在。产品风味模型化了你的分发策略,你想要分发N个不同的应用程序,这些应用程序逻辑上都是相同的应用程序,只有细微的变化。 - CommonsWare
我该如何在运行时为应用程序选择不同的布局? - Rohit Shinde
@RohitShinde:抱歉,我不理解你的问题。你可以在Stack Overflow上提出一个单独的问题,详细说明你的问题和关注点。 - CommonsWare
如果我有两种不同的应用程序风格,它们将具有不同的活动布局。那么,在 Activity 的 onCreate 方法中,我是否需要指定要膨胀的布局?如果是,我如何知道我正在运行哪个应用程序风格? - Rohit Shinde
@RohitShinde:“然后它们也会有不同的活动布局”--你可以这样设置,但这不是默认行为。“我需要在Activity的onCreate方法中指定要填充的布局吗?”--不需要。你只需要在每个flavor的源集中使用相同的布局名称即可。 - CommonsWare

1
如果您没有使用Android Studio,那么我将提及另一种可能性。对于主要功能,您可以创建一个库项目作为两个应用程序的基础(将其作为库项目检查,并将其包含在两个分离项目中),然后扩展活动、类以获得不同的行为。
例如(简单的例子),如果您有两个具有不同闪屏布局的应用程序,比如,则可以在库项目中创建此默认值,并在其他项目的资源目录中的布局文件夹中创建一个具有相同名称的不同文件。第二个项目将使用自己布局文件夹中的那个文件。
我建议使用Android Studio和Gradle与flavors(就像@CommonsWare的答案中所述),但如果您没有使用它,也可以这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接