Как предотвратить возврат к предыдущей деятельности?
Когда на телефоне нажата кнопка BACK, я хочу предотвратить возврат определенного действия к предыдущему.
В частности, у меня есть вход в систему и регистрация экранов, как запуск нового действия под названием HomeScreen
при успешном входе в систему/регистрации. Как только HomeScreen запущен, я хочу, чтобы пользователи не могли вернуться к экранам входа или регистрации, нажав клавишу BACK.
Я пытался использовать Intent.FLAG_ACTIVITY_NO_HISTORY
, но поскольку приложение имеет интеграцию с Facebook, когда используется "Войти с Facebook", Facebook должен вернуться к первоначальному экрану входа, поэтому я должен вести историю этих действий.
Я подумал о том, чтобы переопределить поведение кнопки BACK на HomeScreen
чтобы напрямую закрыть приложение, когда нажата кнопка, и я использовал
@Override
public void onBackPressed() {
finish();
}
но это также не работает.
Ответы
Ответ 1
Мое предложение состояло в том, чтобы завершить работу, в которую вы не хотите, чтобы пользователи возвращались. Например, в вашем знаке активности, сразу после вызова startActivity
, вызовите finish()
. Когда пользователи нажимают кнопку "Назад", они не смогут перейти к активности знака, потому что он был убит со стека.
Ответ 2
Следующее решение может быть очень полезно в обычном сценарии входа/основной активности или реализации блокирующего экрана.
Чтобы свернуть приложение, а не возвращаться к предыдущему действию, вы можете переопределить onBackPressed()
следующим образом:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
moveTaskToBack(boolean nonRoot)
оставляет ваш задний стек как есть, просто ставит вашу задачу (все действия) в фоновом режиме. Точно так же, как если бы пользователь нажал кнопку "Домой" .
Параметр boolean nonRoot
- Если false, это работает только в том случае, если действие является корнем задачи; если true, он будет работать для любой активности в задаче.
Ответ 3
Я не уверен точно, что вы хотите, но похоже, что это должно быть возможно, и это также звучит так, будто вы уже на правильном пути.
Вот несколько ссылок, которые могут помочь:
Отключить кнопку "Назад" в андроиде
MyActivity.java =>
@Override
public void onBackPressed() {
return;
}
Как отключить "вернуться" к некоторой активности?
AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
Ответ 4
Для вашего случая есть два решения: операция A запускает операцию B, но вы не хотите возвращаться к операции A в операции B.
1. Удалено предыдущее действие A из заднего стека.
Intent intent = new Intent(activityA.this, activityB.class);
startActivity(intent);
finish(); // Destroy activity A and not exist in Back stack
2. Отключено действие кнопки возврата в действии B.
Есть два способа предотвратить возврат события, как показано ниже,
1) Рекомендовать подход
@Override
public void onBackPressed() {
}
2) переопределить метод onKeyDown
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK) {
return false;
}
return super.onKeyDown(keyCode, event);
}
Надеюсь, что это полезно, но все же зависит от ваших ситуаций.
Ответ 5
finish()
дает вам способ закрыть текущую активность не всего приложения. И вам лучше не пытаться искать методы для уничтожения приложения. Маленький совет.
Вы пробовали соединение Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
? Не забудьте использовать эти флаги в начале Intent
!
Ответ 6
Поместите finish()
сразу после
Intent i = new Intent(Summary1.this,MainActivity.class);
startActivity(i);
finish();
Ответ 7
paulsm4 ответ правильный. Если в onBackPressed()
вы просто вернетесь, он отключит кнопку "Назад". Тем не менее, я думаю, что лучший подход, учитывая ваш случай использования, - это перевернуть логику действий, т.е. Сделать основную вашу домашнюю деятельность, проверить, подписан ли пользователь там, если нет, запустить действие знака. Причина в том, что если вы переопределите кнопку "Назад" в своей основной деятельности, большинство пользователей будут смущены, когда они вернутся, а ваше приложение ничего не сделает.
Ответ 8
Если вы не хотите возвращаться ко всем действиям в вашем приложении, вы можете использовать
android:launchMode="singleTask"
Подробнее здесь: http://developer.android.com/guide/topics/manifest/activity-element.html
Ответ 9
Этот метод работает нормально
Intent intent = new Intent(Profile.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Ответ 10
Просто переопределите метод onKeyDown и проверьте, была ли нажата кнопка "Назад".
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
//Back buttons was pressed, do whatever logic you want
}
return false;
}
Ответ 11
Помещенный
finish();
Сразу после ActivityStart
чтобы остановить деятельность, препятствующую любому возврату к ней.
Затем добавьте
onCreate(){
getActionBar().setDisplayHomeAsUpEnabled(false);
...
}
К действию, которую вы запускаете.
Ответ 12
@Override
public void onBackPressed() {
}
Когда вы создаете onBackPressed()
просто удалите super.onBackPressed();
и это должно работать
Ответ 13
Поскольку уже предложено много отличных решений, я постараюсь дать более деликатное объяснение.
Как пропустить возвращение к предыдущему занятию?
Удалить предыдущую активность из Backstack. просто
Как удалить предыдущую активность из Backstack?
Вызов метода finish()
Нормальный поток:
Все действия хранятся в стеке, известном как Backstack.
Когда вы запускаете новое действие (startActivity(...)
), то новое действие startActivity(...)
в верхнюю часть стека, а когда вы нажимаете кнопку "назад", действие извлекается из стека.
Один ключевой момент, на который следует обратить внимание, это то, что когда нажата кнопка "Назад", то finish();
метод вызывается внутри. Это поведение по умолчанию метода onBackPressed().
Итак, если вы хотите пропустить занятие B?
то есть A <--- C
Просто добавьте finish();
метод после вашего startActvity(...)
в startActvity(...)
B
Intent i = new Intent(this, C.class);
startActivity(i);
finish();
![enter image description here]()