На данный момент Google рекомендует использовать рефлексию для навигации между функциональными модулями.
В моем случае я создал новый модуль навигации для размещения различных классов навигации. Мой модуль приложения зависит от этого модуля, поэтому каждый функциональный модуль может получить доступ к навигации.
Я использую файл с функциями, чтобы создать экземпляр отражения 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
String является внутренним, оно будет доступно только в навигационном модуле.
Затем вы можете создавать объекты для каждого модуля для управления навигацией.
object SearchNavigation : Navigation {
private const val SEARCH = "com.your_search_activity_package"
override fun getIntent(): Intent? = SEARCH.loadIntentOrNull()
}
Интерфейс навигации просто определяет метод getIntent
:
interface Navigation {
fun getIntent(): Intent?
}
Затем вы можете внедрить этот объект навигации в каждый модуль, так как ваш функциональный модуль зависит от модуля приложения и в то же время зависит от модуля навигации.
Следуя вашей структуре, это будет что-то вроде этого
- приложение (приложение)
- MainActivity
- MainApplication
- featureOne (модуль)
- featureTwo (модуль)
- навигация (модуль)
- featureOneNavigation (объект)
- featureTwoNavigation (объект)
Модуль приложения будет зависеть от модуля навигации. featureOne и featureTwo будут зависеть от приложения (поскольку они являются функциональными модулями) и будут иметь доступ к навигации.
Вы также можете избежать создания нового модуля для навигации и реализовать это только в модуле приложения.
Этот метод может также применяться для создания экземпляров фрагментов, так что вы можете иметь свою активность хоста с DrawerLayout в модуле приложения, а каждый из его фрагментов - в другом модуле.