Android: очистить задний стек

В 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 по-прежнему отображаются, если я использую кнопку "Назад", когда я возвращаюсь к занятию А. Как я могу избежать этого?

Ответ 1

Попробуйте добавить 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

Ответ 2

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

Ответ 3

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

android:noHistory="true"

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

Ответ 4

Это беспокоит меня в течение долгого времени. Наконец, я решил это сделать:

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

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);

Ответ 5

  • Добавить android:launchMode="singleTop" в элемент активности вашего манифеста для Activity A
  • Затем используйте intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) и intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) при запуске Activity A

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

Ответ 6

Начиная с 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

Ответ 7

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

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

а не

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Ответ 8

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

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

Это работа для меня На экране "Платежный платеж" удалите все действия в обратном стеке,

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

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

Ответ 10

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

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();

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

С A, являющимся активностью root, начиная с B или C только с FLAG_ACTIVITY_CLEAR_TOP удаляет B и C из заднего стека.

Ответ 14

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.

Ответ 15

Я нашел интересное решение, которое может помочь. Я сделал это в моем onBackPressed().

finishAffinity();
finish();

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

Ответ 16

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

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

Ответ 17

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

Ответ 18

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

Подробнее см. эту документацию.

Ответ 19

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

Объявить 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();

Ответ 20

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

Ответ 21

Этот пример можно использовать для вызова Activity A из Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

Ответ 22

для меня добавление Intent.FLAG_ACTIVITY_CLEAR_TASK решило проблему

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();

Ответ 23

В дополнение к FLAG_ACTIVITY_CLEAR_TOP вы можете попробовать добавить Intent.FLAG_ACTIVITY_SINGLE_TOP:

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Ответ 24

Данный код работает правильно. Я пробовал в примере жизненного цикла приложения.

У меня нет B и C в заднем стеке после запуска активности A с флагом FLAG_ACTIVITY_CLEAR_TOP

Ответ 25

я назвал activity_name.this.finish() после начала нового намерения, и это сработало для меня.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

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

Ответ 26

Добавить NO History Flag в намерении.

В активности B запустите действие C, как показано ниже → → →

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

Ответ 27

Либо добавьте это в свои Activity B и Activity C

android:noHistory="true"

или Override onBackPressed, чтобы избежать повторного нажатия с помощью return.

@Override
public void onBackPressed() {
   return;
}

Ответ 28

В манифесте

android:launchMode="singleTask"

и

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Ответ 29

Использовать метод setFlags() для чистой обратной стороны, открыть все действия и запустить yourActvity

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

Ответ 30

Это сработало для меня с onBackPressed:

public void onBackPressed()
{
    Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);

    Intent myIntent = new Intent(this, ImageUploadActivity.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
   finish();
}