Какую архитектуру выбрать  -  с единой или множеством Activity?

В постоянно развивающейся сфере разработки Android-приложений приходится принимать ответственные решения, определяющие пользовательский опыт и общую архитектуру приложения. Одним из таких решений является выбор структуры Activity  —  фундаментальных строительных блоков любого Android-приложения. Перед разработчиками возникает дилемма: упрощенный подход с единой Activity (Single Activity), включающей множество Фрагментов, или разрозненная природа множества Activity (Multiple Activities), каждая из которых представляет собой отдельную часть функциональности приложения.

Выбор между одним или несколькими видами Activity сродни выбору чертежа дома: он оказывает существенное влияние на поток, сложность и масштабируемость приложения. Каждый подход имеет свои преимущества и недостатки, отвечает различным требованиям к приложениям и предпочтениям разработчиков. Как начинающие, так и опытные специалисты должны вдумчиво подходить к принятию решений, чтобы их приложения были не только надежными и эффективными, но и обеспечивали оптимальный пользовательский опыт.

В Android-разработке решение об использовании единой или множества Activity зависит от сложности и структуры приложения. У обоих подходов есть свои преимущества и варианты применения.


Единая Activity

При таком подходе все приложение состоит из единой Activity, которая служит контейнером для множества Фрагментов. Фрагменты  —  это UI-компоненты, которые представляют собой часть пользовательского интерфейса или поведения в рамках Activity.

Случаи использования

  • Приложения, основанные на навигации: если навигация в приложении базируется на Фрагментах, таких как нижняя панель навигации или боковая панель, использование единой Activity может упростить навигационный поток.
  • Модульный дизайн: если требуется создать модульное приложение, в котором каждая функция или модуль представлены Фрагментом, и эти Фрагменты можно динамически объединять.
  • Оптимизация использования памяти: единая Activity может быть более эффективна с точки зрения использования памяти, поскольку системе приходится управлять меньшим количеством компонентов.

Плюсы

  • Упрощенная навигация: использование Фрагментов в рамках единой Activity позволяет упростить управление навигацией, особенно в приложениях со сложными навигационными потоками.
  • Повышение производительности: единая Activity более эффективна с точки зрения использования памяти, поскольку системе приходится управлять меньшим количеством компонентов, что может привести к повышению производительности, особенно на устройствах низкого ценового диапазона.
  • Совместное использование ресурсов: Фрагменты в рамках единой Activity могут легко совместно использовать ресурсы и данные, что делает удобной передачу данных между различными частями пользовательского интерфейса.
  • Динамический пользовательский интерфейс: можно создавать динамические и гибкие пользовательские интерфейсы, заменяя Фрагменты в рамках единой Activity, что позволяет создавать модульный и адаптируемый дизайн.
  • Плавные переходы: анимация переходов между Фрагментами может быть более плавной и бесшовной, что улучшает общее впечатление пользователя.

Минусы

  • Проблемы при обработке сложных пользовательских интерфейсов: обработка сложных UI-дизайнов и взаимодействий в рамках единой Activity может привести к появлению более сложного кода, особенно при работе с большим количеством Фрагментов.
  • Трудности в обучении: понимание и реализация жизненного цикла Фрагмента и взаимодействия между Фрагментами может оказаться сложной задачей, особенно для новичков.

Пример

Допустим, у нас есть новостное приложение, в котором на главном экране представлены такие категории, как “Спорт”, “Технологии” и “Развлечения”. При нажатии на категории загружается определенный Фрагмент с соответствующим новостным контентом. Всем этим можно управлять в рамках единой Activity, используя Фрагменты для каждой категории.

Основным преимуществом приложений с единой Activity является полная независимость от базовых механизмов управления задачами и флагов намерений, а также полное владение и контроль над навигацией и общим состоянием приложения (Reddit).


Множество Activity

При таком подходе каждый экран или функция приложения реализуется как отдельная Activity.

Случаи использования

  • Приложения, основанные на задачах: если поток приложений основан на задачах, то есть пользователи выполняют определенные задачи на разных экранах, имеет смысл использовать несколько видов Activity. Например, в приложении “Камера” могут быть отдельные Activity для создания фотографий и видео.
  • Независимые модули: если различные экраны приложения в значительной степени независимы и не имеют большого количества общих данных или компонентов пользовательского интерфейса, то использование множества Activity будет разумным выбором.
  • Простота и модульность: для более простых приложений или приложений, в которых каждый экран должен быть модульным и самодостаточным, подход со множеством Activity может оказаться самым подходящим вариантом.

Плюсы

  • Модульная конструкция: каждая Activity может представлять собой самостоятельный модуль, что облегчает управление и понимание потока приложения.
  • Упрощенная логика пользовательского интерфейса: в более простых приложениях задача управления пользовательским интерфейсом и взаимодействия с пользователем в рамках отдельных Activity может решаться путем создания более простого кода.
  • Изоляция задач: задачи изолированы друг от друга, а значит, проблемы на одном экране с меньшей вероятностью повлияют на другие, что повышает стабильность приложения.
  • Четкое разделение: Activity естественным образом обеспечивают разделение задач, что упрощает организацию и сопровождение кода на различных участках приложения.
  • Упрощение обучения: новичкам будет проще разобраться в концепции Activity и управлять множеством Activity по отдельности, чем работать со сложными взаимодействиями Фрагментов.

Минусы

  • Сложность навигации: управлять навигацией между несколькими Activity может быть непросто, особенно в приложениях со сложными навигационными потоками.
  • Дублирование ресурсов: в разных Activity могут быть продублированы такие ресурсы, как макеты и Drawables, что чревато увеличением размера APK.
  • Потенциальное увеличение объема памяти: каждой Activity соответствует своя память, которая может накапливаться в приложениях с большим объемом памяти и потенциально влиять на производительность.
  • Ресурсотзатратность переходов: анимация переходов между Activity может быть не такой плавной, как при переходах между Фрагментами, что негативно сказывается на общем впечатлении пользователя.

Пример

Примером может служить мессенджер, в котором есть различные Activity для создания сообщений, просмотра бесед и управления контактами. Каждая из этих Activity может функционировать независимо и не обязательно будет иметь общие сложные UI-компоненты или данные.


Представьте, что приложение  —  это браузер, Activity  —  окно браузера, а Фрагменты  —  вкладки.

Переключение между приоритетными Activity  —  это ОС-операция, а переключение между Фрагментами  —  переключение вкладок (внутри приложения). Каждая вкладка (Фрагмент) живет в рамках жизненного цикла одного окна браузера (Activity).

Можно использовать несколько окон с несколькими вкладками так же, как и несколько Activity с несколькими Фрагментами в каждой из них. Однако более разумно иметь только одно окно с несколькими вкладками (Reddit).

В итоге можно сказать, что оба подхода  —  как с единой, так и со множеством Activity  —  находят свое место в Android-разработке. Выбор должен основываться на конкретных требованиях и дизайне приложения. При принятии решения всегда учитывайте удобство использования, простоту обслуживания и производительность приложения.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Betul Necanli: Single Activity vs Multiple Activities Architecture

Предыдущая статьяОсновные принципы сборки мусора в Java
Следующая статьяРеализация односвязного списка в Golang