Как предотвратить возвращение к предыдущей активности?
Когда на телефоне нажата кнопка НАЗАД, я хочу предотвратить возврат определенного действия к предыдущему.
В частности, у меня есть экраны входа и регистрации, и оба начинают новое действие под названием HomeScreen
когда успешный вход / регистрация происходит. После запуска HomeScreen я хочу запретить пользователям возвращаться к экранам входа в систему или регистрации, нажав клавишу BACK.
Я пытался с помощью Intent.FLAG_ACTIVITY_NO_HISTORY
, но поскольку приложение имеет интеграцию с Facebook, при использовании "Войти через Facebook" Facebook должен вернуться к начальному экрану входа в систему, поэтому я должен вести историю этих действий.
Я думал о переопределении поведения кнопки НАЗАД на HomeScreen
непосредственно завершить приложение, когда кнопка нажата, и я использовал
@Override
public void onBackPressed() {
finish();
}
но это тоже не работает.
15 ответов
Я предлагаю закончить действие, к которому вы не хотите, чтобы пользователи возвращались. Например, при входе в систему сразу после звонка startActivity
, вызов finish()
, Когда пользователи нажимают кнопку "Назад", они не могут перейти к действию входа в систему, поскольку оно было удалено из стека.
Следующее решение может быть очень полезным в обычном сценарии входа / основной активности или реализации экрана блокировки.
Чтобы свернуть приложение, а не возвращаться к предыдущему действию, вы можете переопределить onBackPressed()
как это:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
moveTaskToBack(boolean nonRoot)
оставляет ваш задний стек как есть, просто помещает вашу задачу (все действия) в фоновый режим. То же самое, как если бы пользователь нажал кнопку "Домой".
параметр boolean nonRoot
- Если false, то это работает, только если действие является корнем задачи; если true, это будет работать для любой активности в задаче.
Я не уверен, что именно вы хотите, но звучит так, как будто это возможно, а также звучит так, как будто вы уже на правильном пути.
Вот несколько ссылок, которые могут помочь:
Отключить кнопку назад в Android
MyActivity.java =>
@Override
public void onBackPressed() {
return;
}
Как я могу отключить "вернуться" к какой-либо деятельности?
AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
Для вашего случая есть два решения, например, если операция 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. Отключено действие кнопки возврата назад.
Есть два способа предотвратить возврат события, как показано ниже:
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);
}
Надеюсь, что это полезно, но все же зависит от ваших ситуаций.
Поскольку уже предложено много отличных решений, я постараюсь дать более деликатное объяснение.
Как пропустить возвращение к предыдущему занятию?
Удалить предыдущую активность из Backstack. просто
Как удалить предыдущую активность из Backstack?
Вызов finish()
метод
Нормальный поток:
Все действия хранятся в стеке, известном как Backstack.
Когда вы начинаете новую деятельность (startActivity(...)
) затем новая активность переносится в верхнюю часть стека, и когда вы нажимаете кнопку "назад", активность извлекается из стека.
Один ключевой момент, на который следует обратить внимание, это то, что при нажатии кнопки "Назад" finish();
метод вызывается внутри. Это поведение по умолчанию метода onBackPressed().
Итак, если вы хотите пропустить занятие B?
то есть A <--- C
Просто добавь finish();
метод после вашего startActvity(...)
в упражнении B
Intent i = new Intent(this, C.class);
startActivity(i);
finish();
finish()
дает вам способ закрыть текущую активность, а не все приложение. И вам лучше не пытаться искать методы, чтобы убить приложение. Маленький совет.
Вы пробовали соединение Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
? Не забудьте использовать этот флаг в Intent
начало деятельности!
Этот метод работает нормально
Intent intent = new Intent(Profile.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Положил finish()
сразу после
Intent i = new Intent(Summary1.this,MainActivity.class);
startActivity(i);
finish();
Если вы не хотите возвращаться ко всем действиям в вашем приложении, вы можете использовать
android:launchMode="singleTask"
Узнайте больше здесь: http://developer.android.com/guide/topics/manifest/activity-element.html
Ответ paulsm4 является правильным. Если в onBackPressed()
вы просто вернетесь, он отключит кнопку возврата. Тем не менее, я думаю, что лучший подход, учитывая ваш вариант использования, состоит в том, чтобы перевернуть логику активности, то есть сделать вашу домашнюю деятельность основной, проверить, выполнил ли пользователь там вход, если нет, запустить операцию входа. Причина заключается в том, что если вы переопределите кнопку "Назад" в своей основной деятельности, большинство пользователей будут сбиты с толку, когда они нажимают назад, а ваше приложение ничего не делает.
@Override
public void onBackPressed() {
}
Когда вы создаете onBackPressed()
просто удали super.onBackPressed();
и это должно работать
Просто переопределите метод 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;
}
AndroidManifest.xml
<activity
android:name=".welcome.SplashActivity"
android:noHistory="true" // just add this line
android:exported="true">
</activity>
Положил
finish();
Сразу после ActivityStart прекратить действие, не давая возможности вернуться к нему. Затем добавьте
onCreate(){
getActionBar().setDisplayHomeAsUpEnabled(false);
...
}
К деятельности, которую вы начинаете.
Я думаю, вы можете просто использовать finish() после startActivity().