Сколько стеков может быть в приложении и почему
Что проверяют
Вопрос намеренно двусмысленный: в Android стеком называют и стек вызовов потока, и обратный стек экранов. Смотрят, уточните ли вы, о чём речь, и знаете ли устройство обоих. Теги про многопоточность и память намекают, что одним ответом про Activity не обойтись.
Как отвечать
Стеки вызовов: по одному на поток. Даже пустое приложение держит далеко не один поток: главный, потоки binder для межпроцессных вызовов, служебные потоки сборщика мусора и компиляции. Размер стека задаётся при создании потока и по умолчанию измеряется сотнями килобайт, а куча и загруженные классы общие.
Обратные стеки:
- задача это стек активностей. Обычно у приложения она одна, но задач может быть несколько из-за
launchMode,taskAffinity, флага новой задачи у интента или запуска экрана из другого приложения. В списке недавних такие задачи видны отдельными карточками; - у каждого
FragmentManagerсвой стек, поэтому у вложенных фрагментов он отдельный от родительского; - навигационный граф держит собственный стек назначений поверх всего этого.
Практический вывод: кнопка «назад» ведёт не туда, куда ожидает разработчик, если экран открыт из уведомления или из чужого приложения, и чинится это TaskStackBuilder либо аккуратным launchMode.
Где спотыкаются
Отвечают только про активности и теряют потоки, хотя спрашивали как раз про них. Обратный ход тоже встречается: рассказывают про потоки и не помнят, что у приложения бывает несколько задач.
Считают, что флаг очистки верха стека очищает стек целиком. Он удаляет активности, лежащие выше целевой, и только если целевая уже находится в этом стеке, иначе она просто запустится заново.
Путают переполнение обратного стека с StackOverflowError. Первое про память и неудобную навигацию, второе про рекурсию в одном потоке, и лечатся они совершенно разными способами.