Android design/architecture: 从相同的代码库创建不同的应用程序
Android design/architecture: Create different Apps from same code base
我想从相同的代码库创建两个应用程序。它们的颜色不同,一些数据来自后端。情况就像,假设我想创建应用程序 App1 和 App2。两者都有相似的流量。我可以吗
- Select Header 颜色如果是 App1 是蓝色,其他是红色?
- 在代码中,if(运行 App == App1) { 执行这部分} else {other
部分}?
- 如果 App 是 App1 select layout1.xml for activity else select
layout2.xml?
我不知道该怎么做。任何帮助都会很棒。
谢谢。
如果您使用的是 Android Studio,则您所描述的是产品风味。引用 the documentation:
A product flavor defines a customized version of the application build by the project. A single project can have different flavors which change the generated application.
为了回答这个问题,让我们假设您有一个项目有两种产品风格,flavorOne
和 flavorTwo
。您的项目还将具有三个源集:
src/main/
,你的大部分东西都去哪里了
src/flavorOne/
,一种口味的东西在哪里
src/flavorTwo/
,其他口味的东西去了哪里
考虑到这一点...
Select a Header color Blue if it is App1 and Red for other?
在src/main/res/values/colors.xml
中,定义一个名为header
的颜色,并赋予其蓝色值。在src/flavorTwo/res/values/colors.xml
中,定义一个名为header
的颜色,并赋予其红色值。您应用的其余部分引用 header
颜色(例如,@color/header
、R.color.header
)。当您构建 flavorOne
时,将使用 main
颜色。当您构建 flavorTwo
时,flavorTwo
值将覆盖 main
值。
If App is App1 select layout1.xml for activity else select layout2.xml?
在 src/main/res/layout/thingy.xml
中,定义您的默认布局实现。在 src/flavorTwo/res/layout/thingy.xml
中,定义要用于 flavorTwo
的布局。您的 Java 代码将引用 R.layout.thingy
。当您构建 flavorOne
时,将使用 main
布局。当您构建 flavorTwo
时,flavorTwo
布局将覆盖 main
布局。
In code, if(running App == App1) { execute this part} else {other part}?
这在一定程度上取决于您有多少不同的代码。
如果是实质性的,可以使用策略模式:
在 src/flavorOne/java/
中有一个 StuffStrategy
的实现
在src/flavorTwo/java/
中实现StuffStrategy
在您的 src/main/java
代码中,参考 StuffStrategy
,它将根据您正在构建的风格引入正确的实现
如果代码变化真的很小,您可以使用 buildConfigField
为要添加到 BuildConfig
class,其中该值会因口味而异。 This Stack Overflow answer 显示详细信息。
如果您没有使用Android Studio,那么我会提到另一种可能性。对于主要功能,您可以创建一个库项目作为两个应用程序的基础(将其作为库项目检查,并将其作为库包含到两个单独的项目中),然后扩展您想要的活动 类最终会有不同的行为。
例如(简单的),如果您有两个具有不同启动布局的应用程序,比方说 splash.xml
,您可以在库项目中创建这个默认的,并在布局文件夹中创建一个不同的在其他项目的资源目录中同名。第二个项目将使用它自己的布局文件夹中的那个。
我会推荐 Android Studio 和 Gradle with flavors,如@CommonsWare 的回答,但如果你不使用它,你也可以这样做。
我想从相同的代码库创建两个应用程序。它们的颜色不同,一些数据来自后端。情况就像,假设我想创建应用程序 App1 和 App2。两者都有相似的流量。我可以吗
- Select Header 颜色如果是 App1 是蓝色,其他是红色?
- 在代码中,if(运行 App == App1) { 执行这部分} else {other 部分}?
- 如果 App 是 App1 select layout1.xml for activity else select layout2.xml?
我不知道该怎么做。任何帮助都会很棒。
谢谢。
如果您使用的是 Android Studio,则您所描述的是产品风味。引用 the documentation:
A product flavor defines a customized version of the application build by the project. A single project can have different flavors which change the generated application.
为了回答这个问题,让我们假设您有一个项目有两种产品风格,flavorOne
和 flavorTwo
。您的项目还将具有三个源集:
src/main/
,你的大部分东西都去哪里了src/flavorOne/
,一种口味的东西在哪里src/flavorTwo/
,其他口味的东西去了哪里
考虑到这一点...
Select a Header color Blue if it is App1 and Red for other?
在src/main/res/values/colors.xml
中,定义一个名为header
的颜色,并赋予其蓝色值。在src/flavorTwo/res/values/colors.xml
中,定义一个名为header
的颜色,并赋予其红色值。您应用的其余部分引用 header
颜色(例如,@color/header
、R.color.header
)。当您构建 flavorOne
时,将使用 main
颜色。当您构建 flavorTwo
时,flavorTwo
值将覆盖 main
值。
If App is App1 select layout1.xml for activity else select layout2.xml?
在 src/main/res/layout/thingy.xml
中,定义您的默认布局实现。在 src/flavorTwo/res/layout/thingy.xml
中,定义要用于 flavorTwo
的布局。您的 Java 代码将引用 R.layout.thingy
。当您构建 flavorOne
时,将使用 main
布局。当您构建 flavorTwo
时,flavorTwo
布局将覆盖 main
布局。
In code, if(running App == App1) { execute this part} else {other part}?
这在一定程度上取决于您有多少不同的代码。
如果是实质性的,可以使用策略模式:
在
src/flavorOne/java/
中有一个 在
src/flavorTwo/java/
中实现在您的
src/main/java
代码中,参考StuffStrategy
,它将根据您正在构建的风格引入正确的实现
StuffStrategy
的实现
StuffStrategy
如果代码变化真的很小,您可以使用 buildConfigField
为要添加到 BuildConfig
class,其中该值会因口味而异。 This Stack Overflow answer 显示详细信息。
如果您没有使用Android Studio,那么我会提到另一种可能性。对于主要功能,您可以创建一个库项目作为两个应用程序的基础(将其作为库项目检查,并将其作为库包含到两个单独的项目中),然后扩展您想要的活动 类最终会有不同的行为。
例如(简单的),如果您有两个具有不同启动布局的应用程序,比方说 splash.xml
,您可以在库项目中创建这个默认的,并在布局文件夹中创建一个不同的在其他项目的资源目录中同名。第二个项目将使用它自己的布局文件夹中的那个。
我会推荐 Android Studio 和 Gradle with flavors,如@CommonsWare 的回答,但如果你不使用它,你也可以这样做。