2011-05-12 33 views
39

我有一个启动画面活动,然后登录活动。我的历史堆栈的样子:清除任务中的所有活动?

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

谢谢

+2

“不知道是否使用FLAG_ACTIVITY_CLEAR_TASK将清除出在我的任务与否的所有活动。” - 使用BACK按钮并亲自查看。如果您可以使用BACK按钮回到以前的活动,那么他们仍然在后台。 – 2013-02-19 13:12:10

+1

答案是使用'FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK',不是吗? – 2014-03-31 09:53:46

+0

代码中有一个错字...它应该是'.addFlags(...)'而不是'.addFlag'。 – Developer 2015-06-07 23:02:39

回答

38

是的,应该工作正常。你可以使用:

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

保证,如果一个实例已在运行,而不是顶部,然后在它上面的任何东西会清除,它会被使用,而不是开始一个新的实例(这是有用的,一旦你已经离开欢迎活动 - >活动A,然后你想获得b ack to A欢迎,但额外的标志不应该影响你的情况)。

+12

请注意,您需要使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK。 – Femi 2011-05-12 14:18:18

+0

是的,我的不好,我通常只使用'NEW_TASK'。修改后进行编辑。 – 2011-05-12 14:19:46

+0

一切都很好:甚至没有意识到他们有CLEAR_TASK,所以去看了看。它很高兴知道。 – Femi 2011-05-12 14:21:17

6

Intent.FLAG_ACTIVITY_NO_HISTORY也可以用于您的情况,如果您不希望历史堆栈上的活动。

8

finish()从堆栈中删除活动。所以,如果您启动了LoginActivity并在SplashActivity上调用finish(),然后确实执行相同的步骤启动WelcomeActivity,您将获得所需的行为。不需要使用额外的标志。

+0

这可以工作,并且似乎是2.3的最干净的解决方案。谢谢!对于低于11的API, – jskierbi 2014-04-15 16:21:37

8

使用android:noHistory="true"清单文件中的飞溅活动。

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

不起作用 – 2014-12-05 13:16:57

4
Intent intent = new Intent(this, NextActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
        IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 
0
  • 在情况下,所有三个活动的参与了相同的应用程序(相同taskAffinity),可以挑1,2或3任一以下。否则你应该选择下面的1,2。

    1. 如果你不想从LoginActivity返回回SplashActivity,您可以定义:活动属性noHistory在AndroidManifest.xml中,也可以设置成FLAG_ACTIVITY_NO_HISTORY的意图发动SplashActivity。如果SplashActivity从Launcher启动,您应该选择设置活动属性noHistory的方式。

    2. 如果您不想从WelcomeActivity返回LoginActivity,那么您可以使用上述第1项的活动属性noHistory或FLAG_ACTIVITY_NO_HISTORY。

    3. 如果你想清除回栈上的具体情况,你可以与FLAG_ACTIVITY_NEW_TASK一起使用FLAG_ACTIVITY_CLEAR_TASK(FLAG_ACTIVITY_CLEAR_TASK总是必须配合使用FLAG_ACTIVITY_NEW_TASK)。但是,如果正在启动的活动涉及其他应用程序(即不同的taskAffinity),则该任务将在清除任务后启动其他任务,而不是当前任务。因此请确保正在启动的活动涉及相同的应用程序(taskAffinity)。

相关问题