Программирование
Навигация в многомодульном приложении с использованием глубоких ссылок
В этой статье мы реализуем навигации по нескольким функциональным модулям.
Привет, Android-разработчики, в этой статье мы реализуем навигации по нескольким функциональным модулям.
В чем проблема?
Недавно я настраивал non-compose многомодульный проект. В моем случае, я не был убежден в том, что надо использовать Single Activity Architecture, вместо этого я искал что-то вроде одной Activity для каждого функционального модуля, т.е. каждый функциональный модуль должен иметь как минимум одну Activity в качестве точки входа.
Навигация Jetpack может хорошо работать в многомодульном подходе. Тем не менее, она в основном основана на Фрагментах. Я думаю, что для больших проектов будет много случаев, когда было бы лучше иметь Активити вместо Фрагментов, потому что они будут иметь свой собственный жизненный цикл, и жизнь будет намного проще.
Почему глубокие ссылки?
Существуют и другие способы навигации по модулям, но основная причина выбора глубоких ссылок (DeepLink) заключается в том, что они не зависят от платформы. В будущем могут быть случаи, когда мы будем запускать некоторые функции и захотим, чтобы наши пользователи напрямую переходили к этому конкретному функциональному модулю, просто нажав на ссылку. Так гораздо проще и можно сравнительно быстрее масштабироваться.
Подход
- Мы создадим одну Activity для каждого модуля в качестве точки входа.
- Для каждой Activity мы создадим процессор, который запускает одно конкретное действие после того, как убедится, что входящая глубокая ссылка подходит для этого действия.
Хватит говорить, давайте сделаем.
Навигация в многомодульном приложении с использованием глубоких ссылок
Прежде всего, настройте non-compose проект и создайте два функциональных модуля с именами feature_01 и feature_02 и один core модуль помимо app модуля.
Зависимости модулей можно определить так:
- app зависит от всех модулей core, feature_01 и feature_02
- feature_01 зависит от core
- feature_02 зависит от core
- core ни от чего не зависит
Здесь core является общим модулем для всех остальных модулей.
Затем внутри core модуля создайте пакет для навигации, который будет содержать некоторые классы и интерфейсы, которые будут использоваться для обработки глубоких ссылок для каждого из функциональных модулей.
Прежде всего, создайте интерфейс DeeplinkProcessor. У него будет две функции: одна для сопоставления с deeplink, а другая для выполнения запуска Активити после сопоставления.
Затем создайте обработчик, который будет иметь только одну функцию, process, которая будет отвечать за запуск процессора.
После этого мы создадим DefaultHandler, который будет реализацией этого DeeplinkHandler. Он вызовет функцию выполнения для первого найденного процессора, соответствующего диплинку.
Теперь мы создадим Активити для каждого функционального модуля, а именно Feature01Activity и Feature02Activity. В соответствии с ними мы также создадим DeeplinkProcessor для них обоих, а именно Feature01DeeplinkProcessor и Feature02DeeplinkProcessor.
Для Feature02DeeplinkProcessor мы также можем обрабатывать некоторые дополнительные данные, идущие вместе со ссылкой.
На данный момент у нас есть все строительные блоки для перехода от feature_01 к feature_02. Теперь нам осталось только совместить все это в действии.
Поддержка экземпляров всех этих процессоров может быть утомительной, поскольку в нашем приложении может быть n модулей.
Чтобы помочь с этим, мы будем использовать Dagger-Hilt для предоставления и выполнения всех процессоров, определенных в модулях.
В нашем app модуле создайте объект с именем AppModule, который предоставит контекст приложения и обработчик глубоких ссылок для обработки всех определенных процессоров.
В ProvideDefaultDeeplinkHandler() нам нужно предоставить набор процессоров, но поскольку DeeplinkProcessor — это интерфейс, мы не можем просто предоставить его путем инстанцирования, поэтому нам нужно привязать его с помощью Hilt.
Это привяжет все процессоры к набору, необходимому для создания DefaultHandler.
Теперь мы можем внедрить этот обработчик по умолчанию внутрь нашей MainActivity и обрабатывать глубокие ссылки.
Прежде чем перейти к фактической части навигации, нам нужно scheme и host для MainActivity в файле manifest.xml.
Теперь мы можем попробовать сделать навигацию следующим образом:
Вот пример навигации по модулям:
Код
Весь код вы можете проверить в репозитории.
Еще про глубокие ссылки в Android
- Linkester: тестирование глубоких ссылок в приложении
- Создание глубоких ссылок для содержания приложения (документация)
- Начинаем работу с глубокими ссылками в Android
- Глубокие ссылки в Android с примерами
- Ссылки на приложения и глубокие ссылки с Android 12
- Ваши глубокие ссылки могут быть неработающими: Web Intent-ы и Android 12