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

288
26 апр. '11 в 21:03
источник поделиться
32 ответов
  • 1
  • 2

Попробуйте добавить 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
393
26 апр. '11 в 21:10
источник

Связанные вопросы


Похожие вопросы

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
134
03 дек. '12 в 23:10
источник

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

android:noHistory="true"

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

72
28 июня '11 в 23:38
источник

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

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

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);
53
11 июля '14 в 10:46
источник
  • Добавить 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).

28
26 апр. '11 в 21:35
источник

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

25
30 мая '13 в 1:58
источник

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

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

а не

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
14
16 мая '13 в 10:58
источник

Если ваше приложение имеет минимальную версию 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

8
13 апр. '16 в 15:42
источник

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

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();
7
17 мая '15 в 6:09
источник

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


Добавьте android:noHistory="true" атрибут <activity> в AndroidManifest.xml следующим образом:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>
6
22 авг. '12 в 17:58
источник

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

6
15 дек. '16 в 17:49
источник

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

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
4
10 марта '17 в 13:10
источник

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

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

3
14 дек. '11 в 14:15
источник

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

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
3
23 янв. '19 в 23:59
источник
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
28 окт. '17 в 9:53
источник

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

2
26 апр. '11 в 21:06
источник

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

finishAffinity();
finish();

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

2
12 сент. '18 в 13:01
источник

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

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

2
01 апр. '16 в 10:47
источник

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

1
26 сент. '13 в 17:30
источник

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

Объявить 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
19 апр. '16 в 8:41
источник

Этот пример можно использовать для вызова 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);

1
12 июля '16 в 14:55
источник

В манифесте

android:launchMode="singleTask"

и

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
0
27 сент. '16 в 13:41
источник

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

android:noHistory="true"

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

@Override
public void onBackPressed() {
   return;
}
0
01 апр. '16 в 12:27
источник

Это сработало для меня с 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();
}
0
12 марта '18 в 14:56
источник

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

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
0
07 сент. '17 в 8:03
источник

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

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

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();
0
10 июня '15 в 9:15
источник

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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

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

0
31 окт. '14 в 15:08
источник

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

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

0
26 апр. '11 в 21:11
источник

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

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

0
28 янв. '13 в 12:05
источник
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
0
19 февр. '19 в 14:33
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос