Почему в Android-приложении несколько экземпляров Stack

Ответ

В Android может быть несколько Activity в стеке, так как система использует back stack для навигации. Когда пользователь переходит на новую Activity, предыдущая помещается в стек. При нажатии кнопки "Назад" система извлекает верхнюю Activity из стека и восстанавливает предыдущую.

Пример:

// ActivityA запускает ActivityB
startActivity(Intent(this, ActivityB::class.java))  
// Теперь стек: [A, B]  
// Нажатие "Назад" вернёт пользователя в ActivityA  

Можно управлять стеком через флаги интента (FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_NEW_TASK) или манифеста (launchMode).

Ответ 18+ 🔞

Смотри, тут история про то, как эти ваши активити друг на друге сидят, как мартышки на дереве. Представь себе, ты в приложении — это твоя первая комната, ActivityA. Ты в ней ковыряешься. Потом ты жмёшь кнопку, и тебя выносит в другую комнату, ActivityB.

Что в этот момент происходит? Система, хитрая жопа, не закрывает первую дверь нахуй. Она её аккуратно ставит в стопку, в так называемый back stack. Получается стопка: снизу A, сверху B. Ты теперь в комнате B.

Ты в B всё посмотрел, наделал делов и думаешь: "А пошёл я назад". Жмёшь эту самую кнопку "Назад". Система смотрит на стопку, берёт верхнюю бумажку — это B — и выкидывает её в мусорку (ну, или останавливает, если по-умному). А под ней-то как раз наша родная A! И вот ты уже снова в ней, всё на своих местах. Ёпта, магия!

Вот тебе пример кода, тут без мата, всё чинно:

// ActivityA запускает ActivityB
startActivity(Intent(this, ActivityB::class.java))
// Теперь стек: [A, B]
// Нажатие "Назад" вернёт пользователя в ActivityA

Всё просто, да? Но это если ты не начинаешь ебать систему флагами. А если начать, то тут начинается ёперный театр.

Можно этим стеком управлять, как царь горы. Хочешь, чтобы при запуске новой активити все старые накрылись медным тазом? Пожалуйста, флаг FLAG_ACTIVITY_CLEAR_TOP. Хочешь создать новую независимую стопку задач? Держи FLAG_ACTIVITY_NEW_TASK. А ещё можно в манифесте к каждой активити приписать launchMode — это как характер ей задать: будет ли она одна-единственная, или их будет, как собак нерезаных, в стеке.

Главное — понимать, что творишь. А то настроишь флагов, а потом сам от себя охуеешь: жмёшь "Назад", а тебя выкидывает из приложения на хуй, потому что стек пустой. Волнение ебать! Так что, чувак, с этими флагами ты ходишь по охуенно тонкому льду.