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 ]

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

Попробуйте добавить FLAG_ACTIVITY_NEW_TASK, как описано в документации для FLAG_ACTIVITY_CLEAR_TOP:

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

Итак, ваш код для запуска A будет:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
finish(); // call this to finish the current activity
140 голосов
/ 04 декабря 2012
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
73 голосов
/ 29 июня 2011

Как насчет добавления в файл манифестов для связанной деятельности:

android:noHistory="true"

к определению деятельности B и C?Они не будут добавлены в backstack.Не уверен, что ты этого хочешь.

58 голосов
/ 11 июля 2014

Это беспокоит меня долгое время. Наконец-то я решил это следующим образом:

Во фрагменте используйте:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

В Деятельности используйте (добавьте еще один флаг намерения Intent.FLAG_ACTIVITY_CLEAR_TASK по сравнению с фрагментом):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
28 голосов
/ 26 апреля 2011
  1. Добавьте android:launchMode="singleTop" к элементу действия в манифесте для действия A
  2. Затем используйте intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) и intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) при запуске Действия A

Это означает, что при запуске действия A все задачи поверх него очищаются, так что A находится наверху. Новый задний стек создается с A в корне, и использование singleTop гарантирует, что вы только когда-либо запускаете A один раз (поскольку A сейчас находится на вершине из-за ..._CLEAR_TOP).

25 голосов
/ 30 мая 2013

Начиная с API 16 (Jelly Bean), вы можете просто позвонить finishAffinity().

Теперь вы также можете вызвать ActivityCompat.finishAffinity(Activity activity) с библиотекой совместимости.

Обязательно установите taskAffinityв манифесте с именем пакета, уникальным для этой группы действий.

Подробнее см .:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

14 голосов
/ 16 мая 2013

Попробуйте использовать

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

а не

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
9 голосов
/ 13 апреля 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

7 голосов
/ 22 августа 2012

Согласно Wakka в Удаление активности из стека истории ...


Добавьте атрибут android:noHistory="true" к вашему <activity> вAndroidManifest.xml как это:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>
7 голосов
/ 17 мая 2015

Для будущих исследований, попробуйте этот код.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
...