清除任务中的所有活动?

我有一个启animation面活动,然后login活动。 我的历史堆栈看起来像:

SplashActivity LoginActivity 

当用户通过LoginActivity成功login时,我想启动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()调用展开堆栈来“手动”执行此操作,但会更脆弱,代码更多。

谢谢

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

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

这确保了如果一个实例已经运行,并且不是顶层的,那么顶层的任何东西都会被清除,并且会被使用,而不是开始一个新的实例(这个有用的,一旦你已经走了欢迎活动 – >活动A,然后你想从A返回欢迎,但额外的标志不应该影响你的情况)。

finish()从堆栈中删除活动。 所以,如果你启动了LoginActivity,然后在SplashActivity上调用finish() ,然后再按照相同的方式启动WelcomeActivity,你将会得到所需的行为。 不需要使用额外的标志。

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

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

Intent.FLAG_ACTIVITY_NO_HISTORY也可以在你的情况下工作,如果你不希望历史堆栈上的活动。

 Intent intent = new Intent(this, NextActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 
  • 如果所有的三个活动都涉及同一个应用程序(相同的taskAffinity),你可以select下面的1,2或3。 否则你应该select下面的1,2。

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

    2. 如果您不想从WelcomeActivity返回LoginActivity,那么可以使用上面第一个数字中的任何一个活动属性noHistory或FLAG_ACTIVITY_NO_HISTORY。

    3. 如果要在特定情况下清除堆栈,可以将FLAG_ACTIVITY_CLEAR_TASK与FLAG_ACTIVITY_NEW_TASK结合使用(FLAG_ACTIVITY_CLEAR_TASK总是必须与FLAG_ACTIVITY_NEW_TASK结合使用)。 但是,如果正在启动的活动涉及到其他应用程序(即不同的taskAffinity),则该任务将在任务清除后启动其他任务,而不是当前任务。 所以请确保正在启动的活动涉及相同的应用程序(taskAffinity)。