我正在研究按功能划分为模块的应用程序。
应用程序结构如下:
功能模块不能相互依赖,但是我可以自由编辑它们。 我的目标是从FirstActivity导航到SecondActivity。
我不能使用startActivity(Intent(com.example.featureTwo.SecondActivity))
,因为SecondActivity类对于FirstActivity(不同的独立模块)不可见。
问题是从FirstActivity导航到SecondActivity的正确方法是什么?
我正在考虑使用:
launchActivityFromDifferentModule(EnumWithActivities.SecondActivity)
。 我应该使用哪种方法,不应该使用哪种方法,为什么?
答案 0 :(得分:0)
将模块添加到build.gradle文件中
android {
...
}
dependencies {
..
implementation project(':featureOne')
implementation project(':featureTwo')
}
注意: 库/模块的开发应以独立的方式进行,并应按功能划分。
答案 1 :(得分:0)
在另一个模块中有许多午餐活动的方法
反射
道具:无需在应用模块中定义类,即可轻松导航至另一个类。
缺点:反射正在运行时运行。
DeepLink
道具:为另一个模块(如openFragmentA,addCreditToUserAccount等)中的任何项目创建唯一链接。
缺点:不用担心。
广播
道具:在app模块中声明确定的活动(如果内部装有nav模块)。
缺点:需要更多时间来更改和定义另一个模块。
结论
Deeplink适用于动态功能(按需功能) 广播适合主要功能,永久性功能 当不确定对A / B测试功能之类的功能时,反射是合适的
答案 2 :(得分:0)
Google目前建议的方法是使用反射在功能模块之间导航。
就我而言,我创建了一个新的导航模块来承载不同类别的导航。我的App模块依赖于此模块,因此每个功能模块都可以访问导航。
我使用带有函数的文件来通过反射实例化Intent
:
private const val PACKAGE_NAME = "com.your_app_package_name"
private fun intentTo(className: String): Intent =
Intent(Intent.ACTION_VIEW).setClassName(PACKAGE_NAME, className)
internal fun String.loadIntentOrNull(): Intent? =
try {
Class.forName(this).run { intentTo(this@loadIntentOrNull) }
} catch (e: ClassNotFoundException) {
null
}
请注意,loadIntentOrNull
字符串扩展名是内部的,它将仅在导航模块中可用。
然后,您可以为每个模块创建对象以处理导航。
object SearchNavigation : Navigation {
private const val SEARCH = "com.your_search_activity_package"
override fun getIntent(): Intent? = SEARCH.loadIntentOrNull()
}
导航界面仅定义了getIntent
方法:
interface Navigation {
fun getIntent(): Intent?
}
然后,您可以在每个模块中插入此导航对象,因为功能模块取决于应用程序模块,同时,它也取决于导航模块。
按照您的结构,将是这样
app模块将取决于导航模块。 featureOne和featureTwo将取决于应用程序(因为它们是功能模块),并且可以访问导航。
您还可以避免为导航创建一个新模块,而仅在app模块中实现它。
此方法也可以应用于实例化Fragment,因此您可以通过app模块中的DrawerLayout进行主机活动,并将其每个Fragments置于不同的模块中。