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

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

В частности, у меня есть экраны входа и регистрации, и оба начинают новое действие под названием 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().

Другие вопросы по тегам