Как предотвратить возвращение к предыдущей активности? - PullRequest
190 голосов
/ 25 декабря 2011

Когда на телефоне нажата кнопка НАЗАД, я хочу, чтобы определенный вид деятельности не возвращался к предыдущему.

В частности, у меня есть экраны входа и регистрации, и оба запускают новое действие под названием HomeScreen, когда происходит успешный вход в систему / регистрация. После запуска HomeScreen я хочу запретить пользователям возвращаться к экранам входа или регистрации, нажав клавишу BACK.

Я пытался использовать Intent.FLAG_ACTIVITY_NO_HISTORY, но поскольку приложение имеет интеграцию с Facebook, при использовании «Войти через Facebook» Facebook должен вернуться к начальному экрану входа в систему, поэтому я должен сохранить историю этих действий.

Я думал о переопределении поведения кнопки НАЗАД на HomeScreen для непосредственного завершения приложения, когда кнопка нажата, и я использовал

@Override
public void onBackPressed() {
    finish();
}

но это тоже не работает.

Ответы [ 13 ]

322 голосов
/ 28 декабря 2011

Я бы предложил завершить действие, к которому пользователи не хотят возвращаться.Например, при входе в игру сразу после звонка startActivity звоните finish().Когда пользователи нажимают кнопку «Назад», они не могут перейти к действию входа, поскольку оно было удалено из стека.

95 голосов
/ 21 октября 2014

Следующее решение может быть очень полезным в обычном сценарии входа / основной активности или реализации экрана блокировки.

Чтобы свернуть приложение, а не возвращаться к предыдущей активности, вы можете переопределить onBackPressed() следующим образом:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot) оставляет ваш задний стек как есть, просто помещает вашу задачу (все действия) в фоновый режим. То же самое, как если бы пользователь нажал кнопку «Домой» .

Параметр boolean nonRoot - Если false, то это работает, только если действие является корнем задачи;если true, это будет работать для любой активности в задаче.

34 голосов
/ 25 декабря 2011

Я не уверен, что именно вы хотите, но звучит так, как будто это возможно, и также кажется, что вы уже на правильном пути.

Вот несколько ссылок, которые могут помочь:

Отключить кнопку возврата в Android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Как я могу отключить «вернуться» к какой-либо деятельности?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
17 голосов
/ 26 октября 2016

Для вашего случая есть два решения: операция 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 голосов
/ 25 декабря 2011

finish() дает вам способ закрыть текущую активность, а не все приложение.И вам лучше не пытаться искать методы, чтобы убить приложение.Маленький совет.

Вы пробовали соединение Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY?Не забудьте использовать эти флаги в Intent начальной активности!

3 голосов
/ 17 апреля 2015

Положите finish() сразу после

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();
2 голосов
/ 15 апреля 2019

Так как уже предложено много отличных решений, я попытаюсь дать более деликатное объяснение.

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

Удалить предыдущее действие из Backstack. Простой

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

вызов finish() метод

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

enter image description here
Все действия хранятся в стеке, известном как Backstack.
Когда вы начинаете новое действие (startActivity(...)), то новое действие помещается в верхнюю часть стека, а когда вы нажимаете кнопку «Назад», действие извлекается из стека.
Одна ключевая точка , на которую следует обратить внимание, это то, что при нажатии кнопки «Назад» метод finish(); вызывается внутри. Это поведение по умолчанию метода onBackPressed ().

Итак, если вы хотите пропустить занятие B?

то есть A <--- C </p>

Просто добавьте finish(); метод после вашего startActvity(...) в Деятельности B

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

enter image description here

2 голосов
/ 25 марта 2017

Этот метод работает нормально

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
2 голосов
/ 28 октября 2015

Если вы не хотите возвращаться ко всем действиям в своем приложении, вы можете использовать

android:launchMode="singleTask"

Подробнее здесь: http://developer.android.com/guide/topics/manifest/activity-element.html

2 голосов
/ 26 декабря 2011

paulsm4 ответ правильный. Если в onBackPressed() вы просто вернетесь, кнопка возврата будет отключена. Тем не менее, я думаю, что лучший подход, учитывая ваш вариант использования, состоит в том, чтобы перевернуть логику активности, то есть сделать вашу домашнюю активность основной, проверить, выполнил ли пользователь там вход, если нет, запустить операцию входа. Причина заключается в том, что если вы переопределите кнопку «Назад» в своей основной деятельности, большинство пользователей будут сбиты с толку, когда они нажимают назад, а ваше приложение ничего не делает.

...