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

+303
26 апр. '11 в 18:03
источник поделиться
35 ответов
  • 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
+405
26 апр. '11 в 18:10
источник

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


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

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

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

android:noHistory="true"

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

+73
28 июн. '11 в 20: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);
+58
11 июл. '14 в 7: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 в 18: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
29 мая '13 в 22:58
источник

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

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

а не

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+14
16 мая '13 в 7: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

+9
13 апр. '16 в 12:42
источник

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


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

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

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

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 в 3:09
источник

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

+6
15 дек. '16 в 14: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 в 10:10
источник
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 в 6:53
источник

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

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
+3
23 янв. '19 в 20:59
источник

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

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

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

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

finishAffinity();
finish();

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

+3
12 сент. '18 в 10:01
источник

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

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

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

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

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

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

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

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

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

Этот пример можно использовать для вызова 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 в 11:55
источник

В манифесте

android:launchMode="singleTask"

и

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

Вот как я решил проблему:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}
0
15 мар. '19 в 12:44
источник

Пример Kotlin:

      val intent = Intent(this@LoginActivity, MainActivity::class.java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()
0
28 февр. '19 в 0:18
источник

Это сработало для меня с 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 в 11:56
источник
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
0
19 февр. '19 в 11:33
источник

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

android:noHistory="true"

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

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

Использовать метод 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 в 5: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 в 6:15
источник

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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

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

0
31 окт. '14 в 12:08
источник
  • 1
  • 2

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