Какие launch modes существуют для Activity? Объясните разницу между standard, singleTop, singleTask и singleInstance.
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные 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 на запуск ActivityAсоздаст новый экземпляр: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" />
Сравнительная таблица
| Критерий | Standard | SingleTop | SingleTask | SingleInstance |
|---|---|---|---|---|
| Новый экземпляр | Всегда создается | Создается, если не на вершине стека | Создается, если нет в задаче | Создается, если нет в системе |
| Задача | Текущая | Текущая | Своя задача (может быть новая) | Своя изолированная задача |
| Множественные экземпляры | Да | Да, в разных местах стека | Нет (один на задачу) | Нет (один в системе) |
onNewIntent() | Не вызывается | Вызывается, если на вершине | Вызывается, если уже в корне задачи | Вызывается, если уже существует |
| Типичное использование | Большинство экранов | Поиск, уведомления | Главный экран (Launcher) | Изолированные функции (звонок) |
Заключение
Выбор режима запуска — это инструмент управления навигационной историей (back stack) и взаимодействием между задачами. Неправильное использование, особенно singleTask и singleInstance, может привести к неожиданному поведению навигации для пользователя. Следует отдавать предпочтение standard и singleTop для большинства внутренних экранов приложения, а singleTask использовать осознанно только для ключевых точек входа. Также важно помнить о возможности управления поведением через флаги Intent (например, FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP), которые могут переопределять или комбинироваться с launchMode, заданным в манифесте.