Завершить все предыдущие действия - PullRequest
337 голосов
/ 13 июня 2011

Мое приложение имеет следующие экраны потока:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Теперь у меня есть общая кнопка log out на каждом экране

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

Я хочу, чтобы, когда пользователь нажимал кнопку выхода из системы (с любого экрана), все экраны заканчивались, и открывался новый экран Log in.

Я попробовал почти все FLAG_ACTIVITY, чтобы добиться этого. Я также прошёл несколько ответов в stackoverflow, но не смог решить проблему. Мое приложение на Android 1.6, поэтому я не могу использовать FLAG_ACTIVITY_CLEAR_TASK

Есть ли способ решить проблему?

Ответы [ 24 ]

498 голосов
/ 13 июня 2011

Использование:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Это очистит все действия сверху дома.

Предполагается, что вы завершаете экран входа в систему, когда пользователь входит в систему, и создается домашняя страница, а затем все экраны с 1 по 5 поверх этого. Код, который я разместил, вернет вас на домашний экран и завершит все остальные действия. Вы можете добавить дополнительное в намерение и прочитать его на домашнем экране, а также завершить его (возможно, снова запустить экран входа в систему или что-то в этом роде).

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

Надеюсь, это поможет.

291 голосов
/ 20 ноября 2012

Вы можете попробовать Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK. Это полностью очистит все предыдущие действия и начнет новую деятельность.

124 голосов
/ 29 июля 2014

Перед запуском новой активности просто добавьте следующий код:

finishAffinity();

Или, если вы хотите, чтобы он работал в предыдущих версиях Android:

ActivityCompat.finishAffinity(this);
38 голосов
/ 02 мая 2012

Когда пользователь желает выйти из всех открытых действий , ему следует нажать кнопку, которая загружает первое действие, которое запускается при запуске приложения, очистить все остальные действия, а затем завершить последнее оставшееся действие.Запустите следующий код, когда пользователь нажимает кнопку выхода.В моем случае LoginActivity - это первое действие в моей программе.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Приведенный выше код очищает все действия, кроме LoginActivity.Затем поместите следующий код в LoginActivity s onCreate(...), чтобы прослушивать при воссоздании LoginActivity и прохождении сигнала 'EXIT':

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Почему создаетсяКнопка выхода в Android так сильно?

Android старается отговорить вас от использования кнопки «выход» в вашем приложении, потому что они хотят, чтобы пользователь никогда не заботился о том, являются ли используемые им программыработает в фоновом режиме или нет.

Разработчики ОС Android хотят, чтобы ваша программа могла пережить неожиданное отключение и выключение телефона, а когда пользователь перезапускает программу, они начинают с того места, где остановились.Таким образом, пользователь может получить телефонный звонок, пока он использует ваше приложение, и открыть карты, которые требуют освобождения вашего приложения для получения дополнительных ресурсов.

Когда пользователь возобновляет работу вашего приложения, он берет его там, где остановился, без перерыва.Эта кнопка выхода узурпирует питание менеджера активности, что может вызвать проблемы с автоматически управляемым жизненным циклом программы для Android.

31 голосов
/ 23 мая 2014
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Это будет работать для всех версий Android.Где IntentCompat класс добавлен в библиотеку поддержки Android.

30 голосов
/ 05 марта 2015

Используйте следующее для действия

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

удалите флаг CLEAR_TASK для использования фрагмента.

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

20 голосов
/ 28 ноября 2012

С developer.android.com :

public void finishAffinity ()

Добавлено в уровень API 16

Завершить это действие, а также все действиянепосредственно под ним в текущей задаче, которые имеют ту же самую близость.Это обычно используется, когда приложение может быть запущено для другой задачи (например, из ACTION_VIEW типа контента, который он понимает), и пользователь использовал навигацию вверх для переключения из текущей задачи и в свою собственную задачу.В этом случае, если пользователь перешел к другим активностям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи.

Обратите внимание, что это завершение не позволяет вамчтобы доставить результаты к предыдущему действию, и будет выдано исключение, если вы попытаетесь это сделать.

17 голосов
/ 27 мая 2018

Полагаю, я опоздал, но есть простой и короткий ответ.В Activity есть метод finishAffinity (), который завершает текущее действие и все родительские действия, но работает только в Android 4.1 или новее.

Для API 16+ используйте

finishAffinity();

Для младше 16, используйте

ActivityCompat.finishAffinity(YourActivity.this);

Надеюсь, это поможет!

13 голосов
/ 03 июля 2016

Если ваше приложение имеет минимальную версию SDK 16, вы можете использовать finishAffinity ()

Завершите это действие, а также все действия непосредственно под ним в текущем задании с таким же сродством.

Это работа для меня. На экране Top Payment удалите все бэк-стеки,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

13 голосов
/ 29 апреля 2017

На заметку, полезно знать
Этот ответ работает (https://stackoverflow.com/a/13468685/7034327)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

, тогда как это не работает

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() заменяет все предыдущие флаги и не добавляет новые флаги, в то время как .addFlags() делает.

Так что это также будет работать

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
...