Мое приложение показывает активность регистрации в первый раз, когда пользователь запускает приложение, выглядит так:
- ActivitySplashScreen (добро пожаловать в игру, зарегистрировать аккаунт?)
- ActivitySplashScreenSignUp (отлично, заполните эту информацию)
- ActivityGameMain (основной экран игры)
поэтому действия запускаются друг в друге именно в таком порядке, когда пользователь нажимает кнопку на каждом экране.
Когда пользователь переходит от действия № 2 к № 3, возможно ли полностью стереть № 1 и № 2 из стека истории? Мне бы хотелось, чтобы, если пользователь находится на # 3 и нажимает кнопку «Назад», он просто переходил на домашний экран, а не обратно на заставку.
Я думаю, что могу сделать это с помощью задач (т.е. начать новую задачу на # 3), но хотел посмотреть, есть ли более простой метод,
Спасибо
Ответы:
Вы можете достичь этого путем установки
android:noHistory
атрибута для"true"
в соответствующих<activity>
записей в вашемAndroidManifest.xml
файле. Например:источник
FLAG_ACTIVITY_NO_HISTORY
.android:noHistory="true"
Вы можете использовать переадресацию, чтобы удалить предыдущее действие из стека действий при запуске следующего. В APIDemos есть пример этого , но в основном все, что вы делаете, это звоните
finish()
сразу после звонкаstartActivity()
.источник
FLAG_ACTIVITY_CLEAR_TOP
не будет работать, потому что C еще не в заднем стеке.Да, взгляните на Intent.FLAG_ACTIVITY_NO_HISTORY .
источник
android:noHistory="true"
в манифесте.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
чтобы установить этот флаг.Это, вероятно, не идеальный способ сделать это. Если у кого-то есть лучший способ, я буду с нетерпением ждать его реализации. Вот как я выполнил эту конкретную задачу с SDK до версии 11.
в каждом классе вы хотите уйти, когда наступит ясное время, вам нужно сделать это:
тогда тот, который должен отключить цепочку всплывающих окон из стека, должен просто вызвать его, когда вы хотите его инициировать:
Тогда действия не в стеке!
Помните, ребята, что вы можете начать действие, а затем начать убирать за ним, выполнение не следует ни за одним (пользовательским) потоком.
источник
Один из способов, который работает до API 11, - это
ActivityGameMain
сначала запустить , а затемonCreate
из этого действия начать своюActivitySplashScreen
деятельность.ActivityGameMain
Не будет появляться , как вы называете startActivity слишком рано для всплеска.Затем вы можете очистить стек при запуске
ActivityGameMain
, установив эти флаги в Intent:Вы также должны добавить это в ActivitySplashScreen:
Так что, нажимая на эту активность, вы не вернетесь к вашей
ActivityGameMain
.Я полагаю, что вы не хотите, чтобы экран-заставка возвращался, либо для достижения этого я предлагаю установить его
noHistory
в своемAndroidManifest.xml
. Затем поместитеgoBackPressed
код в свойActivitySplashScreenSignUp
класс.Однако я нашел несколько способов сломать это. Запустите другое приложение с уведомлением, пока
ActivitySplashScreenSignUp
отображается и история изменений не сбрасывается.Единственный реальный способ обойти это в API 11:
источник
Я использую этот способ.
источник
Я знаю, что опоздал на это (прошло два года с тех пор, как был задан вопрос), но я достиг этого, перехватив нажатие кнопки «назад». Вместо того, чтобы проверять конкретные действия, я просто смотрю на счетчик, и если он меньше 3, он просто отправляет приложение обратно (приостанавливает приложение и возвращает пользователя к тому, что было запущено перед запуском). Я проверяю менее трех, потому что у меня только один вводный экран. Кроме того, я проверяю счетчик, потому что мое приложение позволяет пользователю вернуться к главному экрану через меню, что позволяет ему выполнять резервное копирование через другие экраны, как обычно, если в стеке есть действия, отличные от вступительного экрана.
источник
В манифест вы можете добавить:
Вы также можете позвонить
сразу после вызова startActivity (..)
источник
Просто установите
noHistory="true"
в файле манифеста . Это делает деятельность удаляемой из backstack.источник
Это безумие, что никто не упомянул это элегантное решение. Это должен быть принятый ответ.
SplashActivity -> AuthActivity -> DashActivity
Ключевым моментом здесь является использование
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
для посредникаActivity
. Как только это среднее звено будет разорвано,DashActivity
завещание будет первым и последним в стеке.android:noHistory="true"
это плохое решение, так как оно вызывает проблемы при использованииActivity
обратного вызова, напримерonActivityResult
. Это рекомендуемое решение и должно быть принято.источник
Уже слишком поздно, но надеюсь, что это поможет. Большинство ответов не указывают в правильном направлении. Для такой вещи есть два простых флага.
Из документов Android:
источник
Просто вызовите this.finish () перед startActivity (намерением)
источник
Удаление действия из истории выполняется установкой флажка перед действием, которое вы не хотите
A-> B-> C-> D
Предположим, что A, B, C и D - 4 Действия, если вы хотите очистить B и C, тогда установите флаг
В деятельности А и Б
Вот бит кода
источник
источник
Попробуй это:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
это API Уровень 1, проверьте ссылку .
источник
Intent.FLAG_ACTIVITY_NO_HISTORY
?