Skip to content

Latest commit

 

History

History
162 lines (116 loc) · 5.26 KB

01-compose.md

File metadata and controls

162 lines (116 loc) · 5.26 KB

模块独立与组合

一、创建应用

我们先新建一个Empty项目,改项目也是主模块,项目基本信息如下

01-01

  • 应用名称: modules
  • 包名: cn.jkdev.modules

二、创建多个子模块

我们通过建立多个模块的方式来实现应用的独立与组合。

2.1 设置模块

  • 模块名称:app-setting
  • 包名:cn.jkdev.modules.settings
  • 首页:SettingsActivity

2.2 视频模块

  • 模块名称:app-video
  • 包名:cn.jkdev.modules.video
  • 首页:VideoActivity

2.3 结构

完成以上步骤后,我们得到如下的Android项目结构

20230423193610

同时在构建与运行按钮上,我们可以看到,我们的应用已经被分成了三个模块,如下图

20230423193710

这三个模块分别是appapp-settingapp-video,他们都是可以独立运行的APP,可以对他们进行单独的调试。

三、模块独立与组合

3.1 将模块类型进行切换

3.1.1 如何区分模块类型

在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'
}

3.1.2 定义全局的gradle文件

因此,在多模块的情况下,我们可以通过修改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类型,需要添加applicationIdversionCodeversionName,如下

android {
    namespace 'cn.jkdev.setting'

    defaultConfig {
        if (!isRelease) {
            applicationId "cn.jkdev.setting"
            versionCode 1
            versionName "1.0"
        }
    }
}

此时,如果我们把公共配置文件中的isRelease改为true,那么所有的子模块都将变成Library类型;如果我们把公共配置文件中的isRelease改为false,那么所有的模块都将变成APP类型。当子模块是Library类型时,他们将不会出现在构建与运行按钮上,也就是说,他们将不会被单独运行,只能作为其他模块的依赖。如下图

20230423200256

同时,我们需要在APP主模块的build.gradle文件中的dependencies节点引用各个子模块,如下

if (isRelease) {
    implementation project(':app-video')
    implementation project(':app-setting')
}

3.2 创建主界面

根据第二步,我们已经创建了三个模块,他们都是可以独立运行的APP,但是我们的应用还需要一个主界面,这个主界面需要包含app-settingapp-video两个模块的入口,这样才能实现应用的独立与组合。我们先在activity_main.xml中添加两个按钮,分别用于跳转到app-settingapp-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))
        }
    }
}

我们需要把对应子模块的页面修改对应的文字,以便区分。