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

Какие launch modes существуют для Activity? Объясните разницу между standard, singleTop, singleTask и singleInstance.

2.0 Middle🔥 171 комментариев
#Android компоненты#Жизненный цикл и навигация

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

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

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

Основные Launch Modes для Activity

В Android существует четыре стандартных launch mode (режима запуска) для Activity, которые определяют, как экземпляр Activity должен ассоциироваться с текущей задачей (task). Они объявляются в манифесте (AndroidManifest.xml) в атрибуте android:launchMode или могут задаваться через флаги в Intent.

1. Standard (стандартный)

Режим по умолчанию. При каждом новом Intent создается новый экземпляр Activity, даже если такой же Activity уже существует в стеке (back stack) задачи.

  • Поведение: Новый экземпляр помещается поверх существующего стека в текущей задаче.
  • Использование: Самый распространенный режим. Подходит для большинства сценариев, где требуется несколько экземпляров одного Activity (например, экран создания новой заметки в приложении для заметок).
  • Пример: В задаче уже есть A -> B -> A. Новый Intent на запуск Activity A создаст новый экземпляр: A -> B -> A -> A (новый).
<activity android:name=".StandardActivity"
    android:launchMode="standard" />

2. SingleTop

Один на вершине. Новый экземпляр создается только если существующий экземпляр этого Activity не находится на вершине стека текущей задачи. Если он на вершине, то новый Intent будет передан в существующий экземпляр через метод onNewIntent().

  • Поведение: Проверяет вершину стека. Совпадение на вершине -> onNewIntent(). Нет совпадения на вершине -> создается новый экземпляр.
  • Использование: Полезно для предотвращения множественных экземпляров одного Activity, когда он уже виден пользователю. Классический пример — Activity уведомления (notification) или поисковой выдачи.
  • Пример: Стек A -> B. Intent на запуск B (на вершине) вызовет onNewIntent() у существующего B. Intent на запуск A создаст новый экземпляр A поверх B: A -> B -> A.
<activity android:name=".SingleTopActivity"
    android:launchMode="singleTop" />

3. SingleTask

Один в задаче. Activity с этим режимом всегда является корневым (root) в своей задаче. Система создает новую задачу для этого Activity, если ее не существует. Если задача уже существует, и экземпляр Activity там есть, то система перенесет эту задачу на передний план и вызовет onNewIntent() для этого экземпляра, уничтожив все Activity, расположенные над ним в стеке этой задачи. Если экземпляра в корне нет, будет создан новый.

  • Поведение: "Один экземпляр на задачу". Контролирует создание и переключение между задачами.
  • Использование: Для главного экрана приложения (MainActivity), который логически является точкой входа. Или для Activity, которая должна быть единственной в своей задаче (например, экран запуска приложения из браузера).
  • Важно: Часто используется в сочетании с атрибутом taskAffinity.
  • Пример: Приложение 1, задача T1: X -> Y. Из Y запускается SingleTaskActivity (Z) с taskAffinity="app2". Система создаст новую задачу T2 с корнем Z. При последующем запуске Z из любого места, задача T2 будет просто выведена на передний план.
<activity android:name=".MainActivity"
    android:launchMode="singleTask"
    android:taskAffinity=".myapp" />

4. SingleInstance

Единственный экземпляр. Наиболее строгий режим. Аналогичен singleTask, но задача, содержащая это Activity, может содержать только этот один Activity. Любые другие Activity, запущенные из этого экземпляра, будут помещены в другие задачи.

  • Поведение: "Один экземпляр в системе, и он один в своей задаче". По сути, изолированная задача.
  • Использование: Крайне специфичные сценарии. Например, Activity для приема вызовов в телефоне (DialerActivity), которая должна существовать в полной изоляции, или лончер. Используется редко.
  • Пример: SingleInstanceActivity (S) запускает OtherActivity (O). S остается один в своей задаче T1, а O будет создан либо в существующей задаче вызывающей стороны, либо в новой задаче T2. Назад из O пользователь попадет в S (в T1), минуя любые другие Activity.
<activity android:name=".SingleInstanceActivity"
    android:launchMode="singleInstance" />

Сравнительная таблица

КритерийStandardSingleTopSingleTaskSingleInstance
Новый экземплярВсегда создаетсяСоздается, если не на вершине стекаСоздается, если нет в задачеСоздается, если нет в системе
ЗадачаТекущаяТекущаяСвоя задача (может быть новая)Своя изолированная задача
Множественные экземплярыДаДа, в разных местах стекаНет (один на задачу)Нет (один в системе)
onNewIntent()Не вызываетсяВызывается, если на вершинеВызывается, если уже в корне задачиВызывается, если уже существует
Типичное использованиеБольшинство экрановПоиск, уведомленияГлавный экран (Launcher)Изолированные функции (звонок)

Заключение

Выбор режима запуска — это инструмент управления навигационной историей (back stack) и взаимодействием между задачами. Неправильное использование, особенно singleTask и singleInstance, может привести к неожиданному поведению навигации для пользователя. Следует отдавать предпочтение standard и singleTop для большинства внутренних экранов приложения, а singleTask использовать осознанно только для ключевых точек входа. Также важно помнить о возможности управления поведением через флаги Intent (например, FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP), которые могут переопределять или комбинироваться с launchMode, заданным в манифесте.