清除任务中的所有活动?

use*_*701 44 android

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

SplashActivity
LoginActivity
Run Code Online (Sandbox Code Playgroud)

当用户通过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.
Run Code Online (Sandbox Code Playgroud)

我可以使用一些标志来做到这一点吗?

// LoginActivity.java
Intent intent = new Intent(this, WelcomeActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)

不确定使用FLAG_ACTIVITY_CLEAR_TASK是否会清除我的任务中的所有活动.我可以通过使用startActivityForResult()调用展开堆栈来"手动"执行此操作,但是会更脆弱并且需要维护更多代码.

谢谢

Jos*_*arl 41

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

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

这确保了如果一个实例已经在运行并且不是顶级的,那么它上面的任何内容都将被清除并且将被使用,而不是启动一个新实例(这在你去过欢迎活动后很有用 - >活动A然后你想从A回到欢迎,但额外的标志不应该影响你的情况).


Dan*_*eón 9

用于android:noHistory="true"清单文件中的splash活动.

<activity 
android:name=".activity.SplashActivity" 
android:theme="@style/theme_noActionBar" 
android:noHistory="true">
Run Code Online (Sandbox Code Playgroud)


Pan*_* C. 8

finish()从堆栈中删除活动.因此,如果您启动LoginActivity并调用finish()SplashActivity,然后您完成同样的操作以启动WelcomeActivity,您将获得所需的行为.无需使用额外的标志.


小智 8

Intent intent = new Intent(this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


Yun*_*tao 7

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