← Назад к вопросам

Что такое Single Activity?

2.0 Middle🔥 283 комментариев
#Архитектура и паттерны#Жизненный цикл и навигация

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Single Activity?

Single Activity (Единая Активность) — это современная архитектурная концепция в разработке под Android, при которой всё приложение строится вокруг единственного экземпляра Activity, а навигация между экранами (фрагментами) и управление UI полностью реализуются через Jetpack Navigation Component, FragmentManager и другие компоненты Architecture Components.

Ключевые принципы и компоненты

В этой архитектуре:

  1. Одна Activity (MainActivity): Служит контейнером-хостом для всего приложения. Она содержит NavHostFragment (обычно в разметке) и обрабатывает общие задачи уровня Activity: глобальную навигацию, работу с системными UI, запросы разрешений, глубокие ссылки.

  2. Множество Fragment (Фрагментов): Каждый отдельный экран приложения (логин, список, детали, настройки) реализуется как независимый Fragment. Они становятся атомарными, переиспользуемыми единицами UI и логики.

  3. 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.