构建单Activity的APP——组件化「上」

355 阅读3分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

这篇文章开始介绍组件化的基础知识。

创建 Android 库

右键点击[你的项目] -> [New] -> [Module]

然后会出现这样一个弹框,选择 [Android Library] ,旁边有给模块命名的地方,完成后点击 [Finish]。这样一个模块(组件)就建好了。

此时给你的app模块的build.gradle中添加这么一行代码,app就能引用到module_test中的代码了。

implementation project(path: ':module_test')

Android Library和Android APP、Java Library的区别

Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码、资源文件、Android Manifest)。

Android App最终被编译打包成能在Android设备上运行的APK文件,但是Android Library被编译成供其它Android App依赖的Android Archive (AAR)文件。

Java Library最终被编译打包成Java Archive(JAR)文件,它不能打包Android资源文件,但是Android Library不仅能打包Java文件还能打包Android资源文件。

从上图可以发现我们刚刚生成「module_test」模块小图标和其他三个module的不一样,这说明的是他们的文件夹类型不一样,module_test 是Android library,其他的module是Android App(app也是一样的)。

他们的区别是build.gradle中的不同。Android App的build.gradle文件是这样的(以module_common为例):

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
android {
    defaultConfig {
        applicationId "com.example.module_common"
    }
}

而Android library把「com.android.application」这个插件改成了「com.android.library」,并去掉了defaultConfig中的「applicationId」。

plugins {
    id 'com.android.library'
    id 'kotlin-android'
}
android {
    defaultConfig {
        // applicationId "com.example.module_common"
    }
}

掌握这个这个区别,我们就可以随意把Android library和Android App转换了。

组件化

组件化的意义简而言之就是将项目变得更加任意维护。

我们项目中组件化一般是如下图所示的菱形结构,最上层是包裹所有的业务的主模块,引用着各个业务模块或者公共模块(图中未展示),最下层是各个公共组件,可以供多个APP使用。

image.png

此时有个问题,login的Fragment如何跳转到test1中的Fragment中呢?

在这里先介绍一个通用的解决方案:在common模块中定义个跳转接口,再在App去实现它。

// common Jump.kt
interface IJump {
    fun jumpTo(id:Int)
}
// app MainActivity.kt
class MainActivity : AppCompatActivity(),IJump {
    override fun jumpTo(id: Int) {
        val map = SparseArray<Fragment>()
        map.append(0,LoginFragment())
        //...
        binding.fragment.replace(map[id]) // 模拟切换Fragment
    }
}

在Common中定义一个接口给模块使用,然后在主模块app中实现,以及维护各个模块的Fragment列表。这样各个模块就可以通过这个Fragment列表找到其他模块中的Fragment了。

当然,上面的这些伪代码并不严谨,只是为大家解释一下通用的跨模块获取实例的原理,我们自己实现一些非Fragment实例的跨模块获取就用类似的方法。下一篇将为大家介绍Navigation中的组件化。

注:实际上在开发和使用模块的时候需要注意很多东西,这里无法一一介绍,请点击库模块开发注意事项

相关文章: