愈來愈多的項目使用了組件化,組件之間的通訊是一個比較重要的問題。ARouter
等路由方案爲咱們提供瞭解決辦法。那麼若是不使用 Router 如何實現組件間的界面跳轉呢?java
setClassName
從一個 Activity 跳轉到另外一個Activity 的最直接方法以下:android
val intent = Intent(this, TestActivity::class.java)
startActivity(intent)
複製代碼
可是,採用這種方法,當原 activity 位於一個 module(例如 FeatureA
)中,而目標 activity 位於另外一個 module (FeatureB
)中時,該怎麼辦?git
咱們可使用 Intent 的 setClassName
方法github
val intent = Intent()
intent.setClassName(this, 「com.flywith24.demo.TestActivity」)
startActivity(intent)
複製代碼
可是這種方式硬編碼目標 activity 的完整類名,若是 activity 的類名被更改或者移動,並且沒有更改硬編碼,則編譯能夠經過,可是運行時崩潰app
若是能夠自動生成 activity 完整類名就行了ide
咱們知道 activity 做爲 Android 的組件之一須要在 Manifest 文件中聲明組件化
<activity android:name=」com.flywith24.demo.MainActivity」 />
<activity android:name=」com.flywith24.demo.TestActivity」 />
複製代碼
若是咱們的數據是從 Manifest 中得到的,那麼就解決了硬編碼的問題了ui
有這樣一個插件 ,在 build 時會將全部在 Manifest 中聲明的 activity 的完整類名以靜態常量的形式羅列到一個靜態類中this
object QuadrantConstants {
const val MAIN_ACTIVITY: String = "com.gaelmarhic.quadrant.MainActivity"
const val SECONDARY_ACTIVITY: String = "com.gaelmarhic.quadrant.SecondaryActivity"
const val TERTIARY_ACTIVITY: String = "com.gaelmarhic.quadrant.TertiaryActivity"
}
複製代碼
這樣在使用時就避免了硬編碼編碼
val intent = Intent()
intent.setClassName(context, QuadrantConstants.MAIN_ACTIVITY)
startActivity(intent)
複製代碼
組件化中 app
module 會依賴全部的功能 module ,所以若是咱們使用依賴注入在 app
中將全部的目標 activity 的完整類名聲明出來,也能達到解決硬編碼的問題
這裏以 koin 爲例
class MyApplication : Application() {
val myModule = module {
single { Feature2Activity::class.java.name }
}
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApplication)
modules(myModule)
}
}
}
複製代碼
這樣經過 get() 方法便可拿到 Feature2Activity
的完整類名
val intent = Intent()
.setClassName(this@Feature1Activity, get())
.putExtra("key", "value")
startActivity(intent)
複製代碼
各位有什麼想法歡迎在評論區留言
我是 Fly_with24