Когда на телефоне нажата кнопка НАЗАД, я хочу предотвратить возврат определенной активности к предыдущей.
В частности, у меня есть экраны входа и регистрации, и оба запускают новое действие, которое вызывается HomeScreen
при успешном входе в систему / регистрации. После запуска HomeScreen я хочу запретить пользователям возвращаться к экранам входа или регистрации, нажав клавишу BACK.
Я пытался использовать Intent.FLAG_ACTIVITY_NO_HISTORY
, но поскольку приложение имеет интеграцию с Facebook, когда используется «Войти через Facebook», Facebook должен вернуться к начальному экрану входа в систему, поэтому я должен хранить историю этих действий.
Я думал о переопределении поведения кнопки НАЗАД HomeScreen
для непосредственного завершения приложения, когда кнопка нажата, и я использовал
@Override
public void onBackPressed() {
finish();
}
но это также не работает.
Ответы:
Я предлагаю закончить действие, к которому вы не хотите, чтобы пользователи возвращались. Например, во время входа в систему сразу после звонка
startActivity
позвонитеfinish()
. Когда пользователи нажимают кнопку «Назад», они не могут перейти к действию входа в систему, поскольку оно было удалено из стека.источник
finish
во время совместного перехода, вы можете получить доступ к предыдущей активности. например, если у вас естьHomeActivity
->IntermediateActivity
->FinalActivity
, и вы звонитеfinish()
вIntermediateActivity
сразу же после запускаFinalActivity
вы увидитеHomeActivity
на короткое время.Следующее решение может быть очень полезным в обычном сценарии входа в систему / основной деятельности или реализации экрана блокировки.
Чтобы свернуть приложение, а не возвращаться к предыдущему действию, вы можете переопределить его
onBackPressed()
так:moveTaskToBack(boolean nonRoot)
оставляет ваш задний стек как есть, просто помещает вашу задачу (все действия) в фоновый режим. То же самое, как если бы пользователь нажал кнопку «Домой» .Параметр
boolean nonRoot
- если false, то это работает, только если действие является корнем задачи; если true, это будет работать для любой активности в задаче.источник
Я не уверен, что именно вы хотите, но звучит так, как будто это возможно, и звучит так, будто вы уже на правильном пути.
Вот несколько ссылок, которые могут помочь:
Отключить кнопку назад в Android
Как я могу отключить «вернуться» к какой-либо деятельности?
источник
System.exit(0)
это называется (я знаю, что это не самая лучшая практика, но я просто хотел привести пример).Для вашего случая есть два решения: операция A запускает операцию B, но вы не хотите возвращаться к операции A в операции B.
1. Удалено предыдущее действие A из заднего стека.
2. Отключено действие кнопки возврата в действии B.
Есть два способа предотвратить возврат события, как показано ниже,
1) Рекомендовать подход
2) переопределить метод onKeyDown
Надеюсь, что это полезно, но все же зависит от ваших ситуаций.
источник
finish()
. Излишне продуман сnohistory
атрибутом, флагами намерений, родительскими тегами манифеста активности и т. Д.! Глупо, спасибо за ответ!Поскольку уже было предложено много отличных решений, я постараюсь дать более деликатное объяснение.
Удалить предыдущее действие из Backstack. просто
finish()
Метод вызоваНормальный поток:
Все действия хранятся в стеке, известном как Backstack.
Когда вы запускаете новый Activity (
startActivity(...)
), то новый Activity помещается в верхнюю часть стека, а когда вы нажимаете кнопку «назад», Activity выталкивается из стека.Один ключевой момент, на который следует обратить внимание, это то, что при нажатии кнопки «Назад»
finish();
метод вызывается изнутри. Это поведение по умолчанию метода onBackPressed ().Итак, если вы хотите пропустить занятие B?
Просто добавьте
finish();
метод после вашегоstartActvity(...)
в упражнении Bисточник
finish()
дает вам способ закрыть текущую активность, а не все приложение. И вам лучше не пытаться искать методы, чтобы убить приложение. Маленький совет.Вы пробовали соединение
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
? Не забудьте использовать этот флаг вIntent
начале деятельности!источник
FLAG_ACTIVITY_NO_HISTORY
запрещает моему LoginScreen захватывать обратный вызов Facebook, когда используется Login with Facebook. Потому что, как только фокус исчезает с экрана входа в систему, он не может быть возобновлен (так как нет истории). Но я не пробовалIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
, я проверю, спасибо!finish()
метод, я не знал об этом.Положить
finish()
сразу послеисточник
Ответ paulsm4 является правильным. Если
onBackPressed()
вы просто вернетесь, он отключит кнопку возврата. Тем не менее, я думаю, что лучший подход, учитывая ваш вариант использования, состоит в том, чтобы перевернуть логику активности, то есть сделать вашу домашнюю активность основной, проверить, выполнил ли пользователь там вход, если нет, запустить операцию входа. Причина в том, что если вы переопределите кнопку «Назад» в своей основной деятельности, большинство пользователей будут смущены, когда они нажимают назад, а ваше приложение ничего не делает.источник
Если вы не хотите возвращаться ко всем действиям в вашем приложении, вы можете использовать
Узнайте больше здесь: http://developer.android.com/guide/topics/manifest/activity-element.html
источник
Этот метод работает нормально
источник
Просто переопределите метод onKeyDown и проверьте, была ли нажата кнопка «Назад».
источник
Когда вы создаете
onBackPressed()
просто удалить,super.onBackPressed();
и это должно работатьисточник
Ставить
сразу после ActivityStart, чтобы остановить действие, не позволяющее вернуться к нему. Затем добавьте
к деятельности, которую вы начинаете.
источник