如何导航到位于不同模块中的活动

时间:2019-07-05 06:35:06

标签: android android-intent

我正在研究按功能划分为模块的应用程序。

应用程序结构如下:

  • 应用(应用程序)
    • MainActivity
    • MainApplication
  • featureOne(模块)
    • FirstActivity
  • featureTwo(模块)
    • SecondActivity

功能模块不能相互依赖,但是我可以自由编辑它们。 我的目标是从FirstActivity导航到SecondActivity。

我不能使用startActivity(Intent(com.example.featureTwo.SecondActivity)),因为SecondActivity类对于FirstActivity(不同的独立模块)不可见。

问题是从FirstActivity导航到SecondActivity的正确方法是什么?

我正在考虑使用:

  • 广播-我将在FeatureTwos清单中从FristActivity发送广播并注册广播接收器。从广播接收器中,我将启动SecondActivity。
  • 深层链接-类似于broadcastReceiver。
  • 在应用程序类中创建函数,并且在应用程序包中包含一个枚举,其中包含我要启动的活动。每当我要启动活动时都将调用此函数:launchActivityFromDifferentModule(EnumWithActivities.SecondActivity)

我应该使用哪种方法,不应该使用哪种方法,为什么?

3 个答案:

答案 0 :(得分:0)

将模块添加到build.gradle文件中

android {
   ...
}

dependencies {
    ..

    implementation project(':featureOne')
    implementation project(':featureTwo')
}

注意: 库/模块的开发应以独立的方式进行,并应按功能划分。

答案 1 :(得分:0)

在另一个模块中有许多午餐活动的方法

  1. 反射

    道具:无需在应用模块中定义类,即可轻松导航至另一个类。

    缺点:反射正在运行时运行。

  2. DeepLink

    道具:为另一个模块(如openFragmentA,addCreditToUserAccount等)中的任何项目创建唯一链接。

    缺点:不用担心。

  3. 广播

    道具:在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?
}

然后,您可以在每个模块中插入此导航对象,因为功能模块取决于应用程序模块,同时,它也取决于导航模块。

按照您的结构,将是这样

  • 应用(应用程序)
    • MainActivity
    • MainApplication
  • featureOne(模块)
    • FirstActivity
  • featureTwo(模块)
    • SecondActivity
  • 导航(模块)
    • featureOneNavigation(对象)
    • featureTwoNavigation(对象)

app模块将取决于导航模块。 featureOne和featureTwo将取决于应用程序(因为它们是功能模块),并且可以访问导航。

您还可以避免为导航创建一个新模块,而仅在app模块中实现它。

此方法也可以应用于实例化Fragment,因此您可以通过app模块中的DrawerLayout进行主机活动,并将其每个Fragments置于不同的模块中。