Как предотвратить возврат к предыдущей деятельности?

Когда на телефоне нажата кнопка 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() вы просто вернетесь, он отключит кнопку "Назад". Тем не менее, я думаю, что лучший подход, учитывая ваш случай использования, - это перевернуть логику действий, т.е. Сделать основную вашу домашнюю деятельность, проверить, подписан ли пользователь там, если нет, запустить действие знака. Причина в том, что если вы переопределите кнопку "Назад" в своей основной деятельности, большинство пользователей будут смущены, когда они вернутся, а ваше приложение ничего не сделает.

Ответ 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()

Нормальный поток:

enter image description here
Все действия хранятся в стеке, известном как 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