清除任务中的所有活动?

时间:2011-05-12 14:01:07

标签: android

我有一个启动画面活动,然后是登录活动。我的历史堆栈看起来像:

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()调用展开堆栈来“手动”执行此操作,但是会更脆弱,需要维护更多代码。

由于

7 个答案:

答案 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以下。

    1. 如果您不想从 LoginActivity 返回 SplashActivity ,则可以在 AndroidManifest.xml 中定义活动属性noHistory或者您可以将FLAG_ACTIVITY_NO_HISTORY设置为启动SplashActivity的意图。如果从Launcher启动SplashActivity,你应该选择设置活动属性noHistory。

    2. 如果您不想从WelcomeActivity返回LoginActivity,您可以使用活动属性noHistory或FLAG_ACTIVITY_NO_HISTORY,如上面的数字1。

    3. 如果您想在特定情况下清除堆栈,可以将FLAG_ACTIVITY_CLEAR_TASKFLAG_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)