Что такое Single Activity?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Single Activity?
Single Activity (Единая Активность) — это современная архитектурная концепция в разработке под Android, при которой всё приложение строится вокруг единственного экземпляра Activity, а навигация между экранами (фрагментами) и управление UI полностью реализуются через Jetpack Navigation Component, FragmentManager и другие компоненты Architecture Components.
Ключевые принципы и компоненты
В этой архитектуре:
-
Одна Activity (
MainActivity): Служит контейнером-хостом для всего приложения. Она содержитNavHostFragment(обычно в разметке) и обрабатывает общие задачи уровня Activity: глобальную навигацию, работу с системными UI, запросы разрешений, глубокие ссылки. -
Множество Fragment (Фрагментов): Каждый отдельный экран приложения (логин, список, детали, настройки) реализуется как независимый Fragment. Они становятся атомарными, переиспользуемыми единицами UI и логики.
-
Jetpack Navigation Component: Это центральный "движок" навигации. Он включает:
* **Граф навигации (`nav_graph.xml`)**: XML-файл, декларативно описывающий все фрагменты (назначения) и возможные переходы между ними.
* **`NavController`**: Объект, который управляет переходами между назначениями в графе. Связывается с UI-компонентами (кнопками, BottomNavigationView).
* **`NavHostFragment`**: Специальный фрагмент, который отображает текущее назначение из графа. Вставляется в макет основной Activity.
Преимущества Single Activity Architecture
- Производительность и плавность: Устранение дорогостоящих операций запуска и уничтожения Activity. Переходы между фрагментами выполняются быстрее и с анимацией на уровне FragmentTransaction.
- Упрощённое управление состоянием: Общие данные и ViewModel можно легко разделять между фрагментами, которые находятся в одной Activity, используя область видимости (
activityViewModels()). - Централизованная и декларативная навигация: Весь поток приложения чётко описан в одном графе. Это упрощает понимание, тестирование и реализацию глубоких ссылок.
- Эффективная работа с Back Stack: Navigation Component предоставляет предсказуемое и гибкое управление стеком возврата для фрагментов.
- Лучшее соответствие современным рекомендациям Google: Активно продвигается Google как стандарт для новых приложений вместе с Jetpack Compose (где
NavHostтакже работает внутри одной Activity).
Пример базовой реализации
Рассмотрим структуру типичного приложения с Single Activity.
1. MainActivity (Единственная Activity):
Её макет содержит только NavHostFragment.
<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</FrameLayout>
2. Граф навигации (nav_graph.xml):
Определяем фрагменты и действия перехода.
<!-- res/navigation/nav_graph.xml -->
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name="com.example.app.HomeFragment"
android:label="Home">
<action
android:id="@+id/action_home_to_details"
app:destination="@id/detailsFragment" />
</fragment>
<fragment
android:id="@+id/detailsFragment"
android:name="com.example.app.DetailsFragment"
android:label="Details" />
</navigation>
3. Навигация из фрагмента:
Переход выполняется с помощью NavController, найденного через findNavController().
// В HomeFragment.kt
button.setOnClickListener {
// Безопасный переход с использованием плагина Safe Args
val action = HomeFragmentDirections.actionHomeToDetails(itemId = 123)
findNavController().navigate(action)
}
Когда использовать и выводы
Single Activity идеально подходит для большинства современных приложений со сложной навигацией, табами, bottom navigation, где важна производительность. Однако для некоторых сценариев (например, приложения с абсолютно независимыми модулями или требующие принципиально разных окон системы) подход с несколькими Activity может быть оправдан.
Таким образом, Single Activity — это не просто "одна Activity", а целая архитектурная парадигма, которая перекладывает ответственность за UI-поток на фрагменты и специализированные библиотеки навигации, делая приложения более структурированными, производительными и простыми в поддержке. Это современный стандарт, к которому движется экосистема Android.