Android: очистить задний стек - PullRequest
304 голосов
/ 26 апреля 2011

В Android у меня есть некоторые действия, скажем, A, B, C.

В A я использую этот код для открытия B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

В B я использую этокод для открытия C:

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

Когда пользователь нажимает кнопку в C, я хочу вернуться к A и очистить задний стек (закройте оба B и C).Поэтому, когда пользователь нажимает кнопку «В», B и C не отображаются, я пытаюсь сделать следующее:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

Но B и C все еще отображаются, если я нажимаю кнопку «Назад», когдаВернемся к занятию А. Как я могу избежать этого?

Ответы [ 35 ]

6 голосов
/ 15 декабря 2016

Использовать finishAffinity ();в задаче C при запуске задачи A для очистки операций обратного стека.

4 голосов
/ 10 марта 2017

используйте этот код для начала нового действия и закройте или уничтожьте все остальные стеки активности или задний сатак ...

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
3 голосов
/ 28 октября 2017
Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.
3 голосов
/ 14 декабря 2011

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

Поскольку A является корневым действием, запуск его с B или C только с FLAG_ACTIVITY_CLEAR_TOP действительно удаляет B и C из заднего стека.

3 голосов
/ 23 января 2019

В котлине это почти так же, как в Java. Только символ | заменяется текстом или . Итак, это написано как -

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
3 голосов
/ 12 сентября 2018

Я нашел интересное решение, которое могло бы помочь. Я сделал это по моему onBackPressed() методу.

finishAffinity();
finish();

FinishAffinity удаляет подключение существующего действия к его стеку. А потом финиш поможет вам выйти из этого занятия. Который в итоге выйдет из приложения.

2 голосов
/ 01 апреля 2016

Intent.FLAG_ACTIVITY_CLEAR_TOP не будет работать в этом случае.Пожалуйста, используйте (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Для более подробной информации, пожалуйста, ознакомьтесь с этой документацией.

2 голосов
/ 26 апреля 2011

Мне кажется, что вам нужно начать Activity C с Activity B, используя startActivityForResult().Когда вы нажимаете кнопку в Activity C, вызываете setResult(RESULT_OK) и finish(), поэтому Activity C заканчивается.В Activity B вы могли бы получить ответ onActivityResult(), также вызвав finish() на себя, и тогда вы вернетесь к Activity A.

2 голосов
/ 19 апреля 2016

Я перепробовал все решения, и ни одно из них не работало для меня индивидуально. Мое решение:

Объявите Activity A как SingleTop, используя [android:launchMode="singleTop"] в манифесте Android.

Теперь добавьте следующие флаги при запуске A из любого места. Это очистит стек.

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();
1 голос
/ 26 сентября 2013

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK);logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

...