我们先新建一个Empty项目,改项目也是主模块,项目基本信息如下
- 应用名称:
modules
- 包名:
cn.jkdev.modules
我们通过建立多个模块的方式来实现应用的独立与组合。
- 模块名称:
app-setting
- 包名:
cn.jkdev.modules.settings
- 首页:
SettingsActivity
- 模块名称:
app-video
- 包名:
cn.jkdev.modules.video
- 首页:
VideoActivity
完成以上步骤后,我们得到如下的Android
项目结构
同时在构建与运行按钮上,我们可以看到,我们的应用已经被分成了三个模块,如下图
这三个模块分别是app
、app-setting
、app-video
,他们都是可以独立运行的APP,可以对他们进行单独的调试。
在Android中,如何将一个模块定义为APP还是Library,是通过build.gradle
文件中的plugins
来进行指定的。在kotlin语言的build.gradle
文件中,如果是模块是APP类型,定义内容将如下
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
如果是Library类型,定义内容将如下
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
}
因此,在多模块的情况下,我们可以通过修改build.gradle
文件中的plugins
来实现模块的独立与组合。为了方便,我们需要创建一个全局的gradle 文件,这个文件将包含所有模块的公共配置,然后在每个模块的build.gradle
文件中,通过apply from
的方式来引用这个全局的build.gradle
文件,这样就可以实现公共配置的统一管理。在这里,我们在项目根目录下创建一个env.gradle
文件,来定义公共的配置内容,如下
ext {
isRelease = false
}
然后我们在各个子模块之中,通过apply from
的方式来引用这个全局的env.gradle
文件,将模块gradle的头部改为如下
apply from: '../app.gradle'
plugins.apply('org.jetbrains.kotlin.android')
if (isRelease) {
plugins.apply('com.android.library')
} else {
plugins.apply('com.android.application')
}
同时在模块的build.gradle
文件中的android.defaultConfig
节点下,如果是APP类型,需要添加applicationId
、versionCode
、versionName
,如下
android {
namespace 'cn.jkdev.setting'
defaultConfig {
if (!isRelease) {
applicationId "cn.jkdev.setting"
versionCode 1
versionName "1.0"
}
}
}
此时,如果我们把公共配置文件中的isRelease
改为true
,那么所有的子模块都将变成Library类型;如果我们把公共配置文件中的isRelease
改为false
,那么所有的模块都将变成APP类型。当子模块是Library类型时,他们将不会出现在构建与运行按钮上,也就是说,他们将不会被单独运行,只能作为其他模块的依赖。如下图
同时,我们需要在APP主模块的build.gradle
文件中的dependencies
节点引用各个子模块,如下
if (isRelease) {
implementation project(':app-video')
implementation project(':app-setting')
}
根据第二步,我们已经创建了三个模块,他们都是可以独立运行的APP,但是我们的应用还需要一个主界面,这个主界面需要包含app-setting
和app-video
两个模块的入口,这样才能实现应用的独立与组合。我们先在activity_main.xml
中添加两个按钮,分别用于跳转到app-setting
和app-video
两个模块的入口,代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/bt_video"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="视频" />
<Button
android:id="@+id/bt_setting"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="设置" />
</LinearLayout>
然后页面在MainActivity
设置点击事件,代码如下
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<View>(R.id.bt_video).setOnClickListener {
startActivity(Intent(this, VideoActivity::class.java))
}
findViewById<View>(R.id.bt_setting).setOnClickListener {
startActivity(Intent(this, SettingActivity::class.java))
}
}
}
我们需要把对应子模块的页面修改对应的文字,以便区分。