Можно ли начать действие в стеке, очистив всю историю до него?
Ситуация
У меня есть стек активности, который идет либо A-> B-> C, либо B-> C (экран A выбирает токен пользователя, но у многих пользователей только один токен).
На экране C пользователь может выполнить действие, которое делает экран B недействительным, поэтому приложение хочет перевести их на экран A, независимо от того, находится ли он уже в стеке. Экран А должен быть единственным элементом в стеке в моем приложении.
Ноты
Есть много других подобных вопросов, но я не нашел ничего, что отвечает на этот точный вопрос. Я попытался позвонить getParent().finish()
- это всегда приводит к исключению нулевого указателя. FLAG_ACTIVITY_CLEAR_TOP
работает только если активность уже в стеке.
источник
Случай 1: только два вида деятельности A и B:
Здесь поток действий - A-> B.. При нажатии на кнопку «Назад» на кнопке B нам нужно закрыть приложение, а затем, при запуске действия B из A, просто вызвать метод finish (), и это не позволит Android сохранить действие A в Backstack.eg для действия A. Loding / Splash экран приложения.
Случай 2: Более двух видов деятельности:
Если есть поток, такой как A-> B-> C-> D-> B и при нажатии кнопки «Назад» в Деятельности B при переходе из Деятельности D. В этом случае мы должны использовать.
Здесь действие B будет запускаться из заднего стека, а не из нового экземпляра из-за Intent.FLAG_ACTIVITY_CLEAR_TOP и Intent.FLAG_ACTIVITY_NEW_TASK очищает стек и делает его верхним. Так что, когда мы нажимаем кнопку «назад», все приложение будет завершено.
источник
С более новой версией Android> = использование API 16
finishAffinity()
подход подходит для> = API 16.
источник
Я тоже потратил на это несколько часов ... и согласен с тем, что FLAG_ACTIVITY_CLEAR_TOP звучит так, как вы бы хотели: очистить весь стек, кроме запускаемого действия, чтобы кнопка «Назад» выходила из приложения. Тем не менее, как отметил Майк Репасс, FLAG_ACTIVITY_CLEAR_TOP работает только тогда, когда запускаемое вами действие уже находится в стеке; когда активности нет, флаг ничего не делает.
Что делать? Поместите запускаемое действие в стек с помощью FLAG_ACTIVITY_NEW_TASK, что делает это действие началом новой задачи в стеке истории. Затем добавьте флаг FLAG_ACTIVITY_CLEAR_TOP.
Теперь, когда FLAG_ACTIVITY_CLEAR_TOP отправляется на поиски нового действия в стеке, оно будет там и будет извлечено до того, как все остальное будет очищено.
Вот моя функция выхода из системы; Параметр View - это кнопка, к которой прикреплена функция.
источник
Вы не должны менять стек. Кнопка возврата Android должна работать как в веб-браузере.
Я могу придумать, как это сделать, но это довольно круто.
Сделайте свою деятельность
singleTask
, добавив ее вAndroidManifest
пример:Расширьте
Application
который будет держать логику, куда идти.Пример:
От а до б:
От B до C:
В С:
и обработайте кнопку возврата
pop()
из стека.Еще раз, вы не должны делать это :)
источник
Application
происходит их получение, ОС не сможет освободить память, оставшуюся от уничтоженных операций.Сразу после запуска нового действия с помощью
startActivity
убедитесь, что вы вызвали его,finish()
чтобы текущее действие не укладывалось за новым.источник
Попробуй это:
источник
Продвинутый многоразовый котлин:
Вы можете установить флаг напрямую, используя метод установки. В Kotlin
or
есть замена для битовой Java или|
.Если вы планируете использовать это регулярно, создайте функцию расширения Intent
Затем вы можете напрямую вызвать эту функцию перед началом
Если вам нужна опция добавления дополнительных флагов в других ситуациях, добавьте необязательный параметр в функцию расширения.
источник
источник
Попробуйте приведенный ниже код,
источник
Для меня ни один из вышеперечисленных методов не работает.
Просто сделайте это, чтобы очистить все предыдущие действия :
источник
Иногда ваш эмулятор Android может не подключиться к инструменту eclipse DDMS и запросить запуск adb вручную. В этом случае вы можете запустить или остановить ADB с помощью командной строки.
источник
Я нашел слишком простой взлом просто сделать это добавить новый элемент в
AndroidManifest
виде: -The
android:noHistory
очистит вашу нежелательную деятельность от стека.источник