Ответ
Да, работал. Launch mode определяет, как Activity будет запущено в стеке (back stack). Основные режимы:
- standard (по умолчанию) – создает новый экземпляр Activity.
- singleTop – если Activity уже на вершине стека, используется существующий экземпляр (onNewIntent()).
- singleTask – только один экземпляр в стеке (очищает все Activity сверху).
- singleInstance – отдельный стек, только для этой Activity.
Пример в манифесте:
<activity
android:name=".MainActivity"
android:launchMode="singleTop"/>
Важно помнить про taskAffinity и флаги интента (FLAG_ACTIVITY_*), которые могут влиять на поведение.
Ответ 18+ 🔞
А, ну это же про launchMode, классика! Ёпта, каждый раз, когда начинаешь ковыряться в этих настройках, чувствуешь себя каким-то архитектором, который решает, куда какой кирпич положить, чтобы всё не развалилось. Но на деле всё проще, чем кажется.
Смотри, есть у тебя эта штука — launchMode. Она, по сути, говорит системе: «Слушай, а как нам эту новую активность в наш стек (это типа история твоих экранов) запихнуть?». И вариантов есть овердохуища, но основных — четыре.
standard— это как по умолчанию. Самый простой, самый тупой. Каждый раз, когда ты её запускаешь, система тупо создаёт новый экземпляр. Запустил её десять раз — получи десять копий в стеке. Жрёт память, конечно, но зато предсказуемо, как удар кирпичом по голове. Никаких сюрпризов.singleTop— уже похитрее. Тут система сначала смотрит: «А эта активность уже на вершине стека? То есть она сейчас и так открыта?». Если да — то новый экземпляр не создаётся, а просто в уже существующий прилетает новый интент, и у тебя вызывается методonNewIntent(). Это чтобы не плодить сущности, если ты, например, из уведомления тыкаешь на ту же самую активность. Но если она где-то в середине стека — тогда создаётся новый экземпляр, как приstandard. Хитрая жопа, но полезная.singleTask— вот тут начинается магия, а иногда и пиздец. Система говорит: «Так, эта активность в моём приложении может быть только в одном экземпляре. Один и хуй с горы». Если её нет — создаст. Если она есть, но где-то глубоко в стеке — система возьмёт, и все активности, которые были над ней, просто выкинет нахуй (уничтожит), а её вытащит наверх. И опять же, вызовет у неёonNewIntent(). Часто так делают для главного экрана.singleInstance— это вообще ёперный театр. Для этой активности система создаёт ОТДЕЛЬНЫЙ стек задач. Только она там одна и будет. Больше никто. Как отшельник в своей пещере. Используется редко, для каких-то особых случаев, типа выбора контакта из телефонной книги.
В манифесте это прописывается просто, смотри:
<activity
android:name=".MainActivity"
android:launchMode="singleTop"/>
Но, бля, есть же ещё и флаги интента! Вот это вообще отдельная песня. Ты можешь прямо в коде, когда запускаешь активность, добавить к интенту флаги типа FLAG_ACTIVITY_NEW_TASK или FLAG_ACTIVITY_CLEAR_TOP. Они могут перебить настройки из манифеста или дополнить их так, что голова кругом пойдёт. И ещё есть taskAffinity — это чтобы активности из разных приложений могли в один стек собираться. В общем, доверия ебать ноль ко всей этой системе, пока сам на граблях не потанцуешь.
Главное — помни: если начинаешь с этим играться, тестируй все сценарии. А то получится, что нажал «Назад», а тебя выкинуло из приложения, потому что стек похуй сломал. Сам от себя охуеешь потом.