Как перейти к активности, расположенной в другом модуле - PullRequest
3 голосов
/ 05 июля 2019

Я работаю над приложением, которое разделено по функциям на модули.

Структура приложения выглядит так:

  • приложение (приложение)
    • MainActivity
    • MainApplication
  • featureOne (модуль)
    • FirstActivity
  • featureTwo (модуль)
    • SecondActivity

Функциональные модули не могут зависеть друг от друга, но я могу редактировать их свободно. Моя цель - перейти от FirstActivity к SecondActivity.

Я не могу использовать startActivity(Intent(com.example.featureTwo.SecondActivity)), поскольку класс SecondActivity не виден FirstActivity (другой независимый модуль).

Вопрос в том, как правильно перейти от FirstActivity к SecondActivity?

Я думал об использовании:

  • Broadcast - я отправляю широковещательную рассылку от FristActivity и регистрирую широковещательный приемник, в явном виде в манифесте. Из broadcastReceiver я бы запустил SecondActivity.
  • Глубокие ссылки - аналогичны широковещательному приемнику.
  • Создание функции в классе приложения и перечисления в пакете приложения, содержащем активацию, которую я хочу запустить. Я бы вызвал эту функцию всякий раз, когда я хочу запустить действие следующим образом: launchActivityFromDifferentModule(EnumWithActivities.SecondActivity).

Какой метод я должен использовать, какой мне не следует и почему?

Ответы [ 3 ]

0 голосов
/ 05 июля 2019
У

есть много подходов к работе за обедом в другом модуле

  1. Отражение

    Реквизиты: легко переходить к другому классу без определения класса в модуле приложения.

    Минусы: отражение работает во время выполнения.

  2. DeepLink

    Реквизиты: создание уникальной ссылки для любого элемента в другом модуле, например openFragmentA, addCreditToUserAccount и т. Д.

    Минусы: не вызывает серьезного беспокойства.

  3. Broadcast

    Реквизиты: объявить определенную активность в модуле приложения (если внутри установлен модуль навигации).

    Минусы: требуется больше времени для изменения и определения другого модуля.

Заключение

Deeplink подходит для динамической функции (функция onDemand) Подходит широковещательная рассылкадля основной функции постоянная функция Отражение подходит, когда не уверены в такой функции, как функция A / B теста

0 голосов
/ 05 июля 2019

На данный момент 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 (модуль)
    • FirstActivity
  • featureTwo (модуль)
    • SecondActivity
  • навигация (модуль)
    • featureOneNavigation (объект)
    • featureTwoNavigation (объект)

Модуль приложения будет зависеть от модуля навигации. featureOne и featureTwo будут зависеть от приложения (поскольку они являются функциональными модулями) и будут иметь доступ к навигации.

Вы также можете избежать создания нового модуля для навигации и реализовать это только в модуле приложения.

Этот метод может также применяться для создания экземпляров фрагментов, так что вы можете иметь свою активность хоста с DrawerLayout в модуле приложения, а каждый из его фрагментов - в другом модуле.

0 голосов
/ 05 июля 2019

Добавьте ваши модули в файл build.gradle

android {
   ...
}

dependencies {
    ..

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

Примечание: Библиотеки / модули должны разрабатываться таким образом, чтобы они были независимыми, иони должны быть разделены по функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...