Activity Launch mode. Activity stack
Activity Stack - это структура данных в Android, используемая для управления порядком Activity в вашем приложении. Она представляет собой стек (последовательность элементов, управляемая по принципу LIFO), в котором каждая Activity помещается на вершину стека при ее запуске и удаляется с вершины стека при завершении.
Когда новая Activity запускается, она помещается в вершину стека и становится активной, перекрывая предыдущую Activity. Когда пользователь закрывает текущую активити или вызывает метод finish()
, Activity удаляется из вершины стека, и предыдущая Activity становится активной.
Стек Activity важен для работы системы навигации в Android. Например, при нажатии на кнопку "назад" на устройстве Android, Activity извлекается из вершины стека, и пользователь возвращается к предыдущей Activity. Также стек Activity используется при запуске новых Activity с флагом FLAG_ACTIVITY_CLEAR_TOP
, чтобы удалить все Activity из стека, находящиеся выше указанной Activity.
2. **singleTop**: Если экземпляр активити уже находится на вершине стека, новое намерение не создаёт новый экземпляр; вместо этого вызывается метод `onNewIntent()` существующего экземпляра. Если активити не на вершине, создаётся новый экземпляр.
```kotlin
1. Activity A (singleTop) // Стек: [A]
Intent -> Start Activity B (singleTop)
2. Activity B (singleTop) // Стек: [A, B]
Intent -> Start Activity C (singleTop)
3. Activity C (singleTop) // Стек: [A, B, C]
Intent -> Start Activity B (singleTop) // Activity B на вершине стека
4. Activity B (onNewIntent() вызван) // Стек: [A, B, C]
launchMode
и тем же Intent
. Если да, то все активити, находящиеся поверх нее в стеке, будут удалены, и метод onNewIntent()
будет вызван у существующей активити. Если нет, будет создан новый экземпляр и помещен в стек.
4. **singleInstance**: Этот режим подобен `singleTask`, но новая активити создается в отдельном экземпляре стека. Он будет единственной активной активити в этом экземпляре стека, и никакие другие активити не будут помещены поверх нее.
### Сравнение режимов запуска
- **Standard**: Каждый раз создаётся новый экземпляр, добавляется в стек.
- **SingleTop**: Если на вершине стека, вызывается `onNewIntent()`, иначе создаётся новый экземпляр.
- **SingleTask**: Новый экземпляр помещается на вершину, удаляя все активити выше него.
- **SingleInstance**: Гарантирует, что активити будет единственным экземпляром в своём собственном стеке.