文章目錄
一. 統一版本管理
- 根目錄下新建一個
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