文章目录
参考文章
https://juejin.cn/post/6844904147641171981
Demo查看
一. 统一版本管理
- 根目录下新建一个
config.gradle
ext { isApplication = true /** * app build */ android = [ applicationId : "com.yiba.galleytest", compileSdkVersion: 28, minSdkVersion : 17, targetSdkVersion : 28, versionCode : 1, versionName : "1.0" ] /** * dependencies version */ dependencies = [ appcompat: "androidx.appcompat:appcompat:1.0.2", gson : "2.8.5" ] }
- 在工程build.gradle中添加
apply from:"config.gradle"
- 替换依赖
implementation rootProject.ext.dependencies.appcompat 或 api "com.google.code.gson:gson:${config.dependencies.gson}" //此处必须是双引号
二. 动态切换library和application
- 定义一个boolean值作为是否为library config.gradle中 (如以上代码中的
isApplication
)
- 也可以定义在
gradle.properties
文件中isApplication=true
使用则为isApplication.toBoolean()
- 需要替换的是applicationId 和顶部的apply from
if (rootProject.ext.isApplication) { //isApplication.toBoolean() apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' }
三. 合并AndroidManifest.xml
- 定义debug和release文件夹(java文件夹平级)放置不同的Manifest
- build中加入
android标签下 sourceSets { main { if (rootProject.ext.isApplication) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' java { exclude 'debug/**' //移除debug文件夹下的资源,即 debug/AndroidManifest.xml } } } }
四. 其他合并的注意点
1. 合并Application的方法
- module需要定义Application的时候, 在java文件夹下新建debug文件夹下定义Application, 在debug中的Manifest中注册
2. 资源冲突整合
- 在module的build.gradle的
defaultConfig
标签下加上resourcePrefix "splash_"
, 即给资源名加前缀 - 不要选择忽略前缀
tools:ignore="ResourceName" ×!
五. 组件间的通信
- 使用Intent传递
需要在Manifest中设置activity的android:exported="true"
val class : Class = Class.forName(包名.BActivity) val intent = Intent(AActivity.this, class) startActivity(intent)
- 使用EventBus
- 使用ARouter
六. ARouter的使用
1. 导入:
在每个module中导入依赖
apply plugin: 'kotlin-kapt'
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
api 'com.alibaba:arouter-api:1.4.0' //这个在library中导入即可
kapt 'com.alibaba:arouter-compiler:1.2.2'
2. 在Application中配置
if (BuildConfig.DEBUG) {
// 日志开启
ARouter.openLog()
// 调试模式开启,如果在install run模式下运行,则必须开启调试模式
ARouter.openDebug()
}
ARouter.init(this)
override fun onTerminate() {
super.onTerminate()
ARouter.getInstance().destroy()
}
3. 使用
-
跳转页:
ARouter.getInstance() .build("a/b") .withInt("i", i) .navigation()
-
目标页:
- 注入
ARouter.getInstance().inject(this) //写在BaseActivity中即可
- 题头加入注解
@Route(path = "a/b")
- 获取传递来的数据
@Autowired(name = "i") @JvmField //必须加上,否则无法编译 var i: Int = -1