Очистить все действия в задаче?
У меня есть активность заставки, а затем активность входа. Мой стек истории выглядит так:
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, вы получите желаемое поведение. Нет необходимости использовать дополнительные флаги.
Ответ 4
Intent.FLAG_ACTIVITY_NO_HISTORY также может работать в вашем случае, если вы не хотите, чтобы активность в стеке истории.
Ответ 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 ниже.
-
Если вы не хотите возвращать SplashActivity из LoginActivity, вы можете определить атрибут деятельности noHistory в AndroidManifest.xml или установить FLAG_ACTIVITY_NO_HISTORY
в намерение запустить SplashActivity. если SplashActivity запускается из Launcher, вы должны выбрать способ установки атрибута действия noHistory.
-
Если вы не хотите возвращать LoginActivity из WelcomeActivity, вы можете использовать либо атрибут действия noHistory, либо FLAG_ACTIVITY_NO_HISTORY
например, номер 1 выше.
-
Если вы хотите очистить стек в определенной ситуации, вы можете использовать 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)