组件化项目 构建一个demo,之后会开始封装各种框架以及遇到的问题
一 组件化项目application 问题
模块共有的初始化,放入BaseApplication 中。
模块自身的特殊功能初始化,放在自己的 Application。
首先是 组件化目录
appdemo
------app
------.gradle
------.idea
------build
------moduleA //各自配 build.gradle 是否作为组件还是单独运行
------moduleB //AndroidManifest.xml 需要配多一分在module目录下 如下图
------.gitignore
------config.gradle --->所有配置的文件都在这
------build.gradle -----》在这引用config.gradle
------gradle.properties
------gradlew
------settings.gradle
...

其中 在moduleA 的 build.gradle 下的
android{
...
//java插件引入了一个概念叫做SourceSets,通过修改SourceSets中的属性,可以指定哪些源文件
//( 或文件夹下的源文件 ) 要被编译 , 哪些源文件要被排除 。
sourceSets {
main {
if (Boolean.valueOf(rootProject.ext.isModule)) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//排除java/debug文件夹下的所有文件
exclude '*module'
}
}
}
}
}
结合上一篇文章来看 一个基本的demo (只是app的目录结构) 就构建完成了
下面就是common 基础库的封装抽取了
首先我们会抽取
baseApplication 这是大家在构建一个项目时都会做的事
初始化application 重复的东西就不说了
我们在实现application初始化的时候 我们也要把每个组件的 需要的初始化的东西也一并初始化了
但是我们知道 一个app里只会存在一个application ,而在app创建的时候我们每个组件都需要初始化自己的东西,那怎么办呢
方法有2
1.创建base module。该module提供基础类库。所有初始化都在baseapplication实现
2.创建BaseApplication类,ModuleConfig类以及BaseApplicationImpl类。BaseApplication类的onCreate()方法中初始化一些全局配置并且初始化模块配置。BaseApplicationImpl类是一个接口类,需要各模块自己去实现各个模块的配置。这些配置的类是定义在ModuleConfig中,在初始化的时候会通过反射创建这些类。
创建一个接口
interface IComponentApplication {
fun init(application: Application)
}
moduleA中
open class Main_App :Application(), IComponentApplication {
private lateinit var daoSession: DaoSession
private lateinit var context: Context
private lateinit var application: Application
companion object {
private var instance: Main_App? = null
fun instance() = instance!!
}
override fun init(app: Application) {
LogUtils.e("main chu shi hua .... ")
instance =this
application=app
context=app.applicationContext
initgreendao(app)
}
}
...
在modulecommon中 的baseapplication 下
oncreate(){
…
moduleApplicationInit(this)
}
以上是组件化 application 解决方式 通过反射的方式实现
二 路由通信
使用Arouter 解决