愈来愈多的项目使用了组件化,组件之间的通讯是一个比较重要的问题。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