Работал ли с Activity launch mode

Ответ

Да, работал. Launch mode определяет, как Activity будет запущено в стеке (back stack). Основные режимы:

  1. standard (по умолчанию) – создает новый экземпляр Activity.
  2. singleTop – если Activity уже на вершине стека, используется существующий экземпляр (onNewIntent()).
  3. singleTask – только один экземпляр в стеке (очищает все Activity сверху).
  4. singleInstance – отдельный стек, только для этой Activity.

Пример в манифесте:

<activity 
    android:name=".MainActivity"
    android:launchMode="singleTop"/>

Важно помнить про taskAffinity и флаги интента (FLAG_ACTIVITY_*), которые могут влиять на поведение.

Ответ 18+ 🔞

А, ну это же про launchMode, классика! Ёпта, каждый раз, когда начинаешь ковыряться в этих настройках, чувствуешь себя каким-то архитектором, который решает, куда какой кирпич положить, чтобы всё не развалилось. Но на деле всё проще, чем кажется.

Смотри, есть у тебя эта штука — launchMode. Она, по сути, говорит системе: «Слушай, а как нам эту новую активность в наш стек (это типа история твоих экранов) запихнуть?». И вариантов есть овердохуища, но основных — четыре.

  1. standard — это как по умолчанию. Самый простой, самый тупой. Каждый раз, когда ты её запускаешь, система тупо создаёт новый экземпляр. Запустил её десять раз — получи десять копий в стеке. Жрёт память, конечно, но зато предсказуемо, как удар кирпичом по голове. Никаких сюрпризов.
  2. singleTop — уже похитрее. Тут система сначала смотрит: «А эта активность уже на вершине стека? То есть она сейчас и так открыта?». Если да — то новый экземпляр не создаётся, а просто в уже существующий прилетает новый интент, и у тебя вызывается метод onNewIntent(). Это чтобы не плодить сущности, если ты, например, из уведомления тыкаешь на ту же самую активность. Но если она где-то в середине стека — тогда создаётся новый экземпляр, как при standard. Хитрая жопа, но полезная.
  3. singleTask — вот тут начинается магия, а иногда и пиздец. Система говорит: «Так, эта активность в моём приложении может быть только в одном экземпляре. Один и хуй с горы». Если её нет — создаст. Если она есть, но где-то глубоко в стеке — система возьмёт, и все активности, которые были над ней, просто выкинет нахуй (уничтожит), а её вытащит наверх. И опять же, вызовет у неё onNewIntent(). Часто так делают для главного экрана.
  4. singleInstance — это вообще ёперный театр. Для этой активности система создаёт ОТДЕЛЬНЫЙ стек задач. Только она там одна и будет. Больше никто. Как отшельник в своей пещере. Используется редко, для каких-то особых случаев, типа выбора контакта из телефонной книги.

В манифесте это прописывается просто, смотри:

<activity 
    android:name=".MainActivity"
    android:launchMode="singleTop"/>

Но, бля, есть же ещё и флаги интента! Вот это вообще отдельная песня. Ты можешь прямо в коде, когда запускаешь активность, добавить к интенту флаги типа FLAG_ACTIVITY_NEW_TASK или FLAG_ACTIVITY_CLEAR_TOP. Они могут перебить настройки из манифеста или дополнить их так, что голова кругом пойдёт. И ещё есть taskAffinity — это чтобы активности из разных приложений могли в один стек собираться. В общем, доверия ебать ноль ко всей этой системе, пока сам на граблях не потанцуешь.

Главное — помни: если начинаешь с этим играться, тестируй все сценарии. А то получится, что нажал «Назад», а тебя выкинуло из приложения, потому что стек похуй сломал. Сам от себя охуеешь потом.