Очистить все действия в задаче?

У меня есть активность заставки, а затем активность входа. Мой стек истории выглядит так:

SplashActivity
LoginActivity

когда пользователь успешно войдет в систему через LoginActivity, я хочу запустить WelcomeActivity, но очистить весь стек:

SplashActivity
LoginActivity // launches WelcomeActivity ->
WelcomeActivity

// but now all three are in the history stack, while I only
// want WelcomeActivity in the stack at this point.

Есть ли какой-нибудь флаг, который я могу использовать для этого?

// LoginActivity.java
Intent intent = new Intent(this, WelcomeActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();

Не уверен, что при использовании FLAG_ACTIVITY_CLEAR_TASK будут удалены все действия в моей задаче или нет. Я могу сделать это "вручную", развязав стек, используя вызовы startActivityForResult(), но будет более хрупким и больше кода для поддержки.

Спасибо

Ответ 1

Да, это должно работать нормально. Вы можете использовать:

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

который гарантирует, что если экземпляр уже запущен и не является вершиной, все что-то поверх него будет очищено, и оно будет использоваться вместо запуска нового экземпляра (это полезно после того, как вы перешли в активную активность → Активность A, а затем вы хотите вернуться к приветствию от A, но дополнительные флаги не должны влиять на ваш случай выше).

Ответ 2

Используйте android:noHistory="true" для активности всплеска в файле манифеста.

<activity 
android:name=".activity.SplashActivity" 
android:theme="@style/theme_noActionBar" 
android:noHistory="true">

Ответ 3

finish() удаляет активность из стека. Итак, если вы запустите LoginActivity и вызовите finish() в SplashActivity, а затем вы точно сделаете то же самое, чтобы запустить WelcomeActivity, вы получите желаемое поведение. Нет необходимости использовать дополнительные флаги.

Ответ 5

Intent intent = new Intent(this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Ответ 6

  • Если все три действия задействованы в одном приложении (одно и то же taskAffinity), вы можете выбрать 1,2 или 3 ниже. в противном случае вы должны выбрать 1,2 ниже.

    1. Если вы не хотите возвращать SplashActivity из LoginActivity, вы можете определить атрибут деятельности noHistory в AndroidManifest.xml или установить FLAG_ACTIVITY_NO_HISTORY в намерение запустить SplashActivity. если SplashActivity запускается из Launcher, вы должны выбрать способ установки атрибута действия noHistory.

    2. Если вы не хотите возвращать LoginActivity из WelcomeActivity, вы можете использовать либо атрибут действия noHistory, либо FLAG_ACTIVITY_NO_HISTORY например, номер 1 выше.

    3. Если вы хотите очистить стек в определенной ситуации, вы можете использовать FLAG_ACTIVITY_CLEAR_TASK в сочетании с FLAG_ACTIVITY_NEW_TASK (FLAG_ACTIVITY_CLEAR_TASK всегда должен использоваться в сочетании с FLAG_ACTIVITY_NEW_TASK). Но если запускаемое действие задействовано в другом приложении (т.е. В другом taskAffinity), задача будет запущена для другой задачи после ее очистки, а не для текущей задачи. поэтому убедитесь, что запускаемое действие участвует в том же приложении (taskAffinity).

Ответ 7

Просто сделайте это, чтобы очистить все предыдущие действия в задании:

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)