我有一个启动画面活动,然后是登录活动。我的历史堆栈看起来像:
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()调用展开堆栈来“手动”执行此操作,但是会更脆弱,需要维护更多代码。
由于
答案 0 :(得分:41)
是的,应该可以正常工作。你可以使用:
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TASK
FLAG_ACTIVITY_NEW_TASK
确保如果一个实例已经在运行并且不是顶级,那么它上面的任何内容都将被清除并且将被使用,而不是启动一个新实例(这在您进入欢迎活动时非常有用 - >活动A,然后你想从A回到欢迎,但额外的标志不应该影响你的情况)。
答案 1 :(得分:9)
对清单文件中的splash活动使用android:noHistory="true"
。
<activity
android:name=".activity.SplashActivity"
android:theme="@style/theme_noActionBar"
android:noHistory="true">
答案 2 :(得分:8)
finish()
从堆栈中删除活动。因此,如果您启动LoginActivity并在SplashActivity上调用finish()
,然后您完成同样的操作以启动WelcomeActivity,您将获得所需的行为。无需使用额外的标志。
答案 3 :(得分:7)
Intent.FLAG_ACTIVITY_NO_HISTORY也适用于您的情况。
答案 4 :(得分:7)
Intent intent = new Intent(this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
答案 5 :(得分:0)
如果同一个应用程序(相同的taskAffinity)中涉及所有三个活动,您可以选择下面的1,2或3。否则你应该选择1,2以下。
如果您不想从 LoginActivity 返回 SplashActivity ,则可以在 AndroidManifest.xml 中定义活动属性noHistory或者您可以将FLAG_ACTIVITY_NO_HISTORY
设置为启动SplashActivity的意图。如果从Launcher启动SplashActivity,你应该选择设置活动属性noHistory。
如果您不想从WelcomeActivity返回LoginActivity,您可以使用活动属性noHistory或FLAG_ACTIVITY_NO_HISTORY
,如上面的数字1。
如果您想在特定情况下清除堆栈,可以将FLAG_ACTIVITY_CLEAR_TASK
与FLAG_ACTIVITY_NEW_TASK
结合使用(FLAG_ACTIVITY_CLEAR_TASK
始终必须与{{1}一起使用})。但是,如果正在启动的活动涉及其他应用程序(即不同的taskAffinity),则任务被清除后任务将启动其他任务,而不是当前任务。因此请确保正在启动的活动涉及同一个应用程序(taskAffinity)。
答案 6 :(得分:0)
只需执行以下操作即可清除任务中的所有先前活动:
finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)