如何清除Android Stack的活动?

时间:2010-11-16 01:29:56

标签: android android-activity stack back-stack

我在Android中有一个包含多个活动的应用程序,我希望用户能够通过按菜单按钮注销。我遇到的问题是

A)Android不允许您终止应用程序和
B)即使我再次将用户发送到LoginActivity,他们也可以随时按返回并直接回到之前的活动。

我已经尝试使用以下两个标志启动Activity:

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

我也亲自尝试过每一个。

当我在另一个StackOverflow中读到时,我也尝试在finish()之后调用startActivity(intent) 问题

10 个答案:

答案 0 :(得分:42)

这应该是按位OR,否则你最终会覆盖之前的标志。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

像这样:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

答案 1 :(得分:35)

在您的登录活动中,覆盖后退按钮,以便隐藏您的应用而不是完成活动:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

还要确保在root活动上设置android:alwaysRetainTaskState =“true”,这样Android在用户不活动30分钟后就不会清除你的堆栈(包括登录活动)。

然后在成功登录时调用finish()。

答案 2 :(得分:31)

根据Wakka中的Removing an activity from the history stack ...


android:noHistory="true"属性添加到<activity>中的AndroidManifest.xml,如下所示:

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>

答案 3 :(得分:6)

如果您使用Android API 11或更高版本,则可以使用以下代码清除堆栈。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

答案 4 :(得分:5)

这不会清除您的活动后筹码。

即使在完成上述所有答案后,当我按下后退按钮时,它会在关闭应用程序之前显示最后一次活动。

这就是我所做的:

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

现在我的应用程序退出了,没有任何麻烦。

答案 5 :(得分:3)

设置Intent.FLAG_ACTIVITY_CLEAR_TOP对我来说非常类似,我没有设置Intent.FLAG_ACTIVITY_NEW_TASK标志。你没试过吗?

答案 6 :(得分:2)

这项工作对我来说:)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

其中A是我的根活动,例如

我有活动A - &gt; B - &gt; C - &gt; D当我在堆栈上调用启动活动E时,我现在有了A - &gt; ë

我不知道这是好事:)但是有效。

答案 7 :(得分:1)

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

写下并注意:LoginActivity必须首先作为Launcher和

启动

如果您编写任何启动器模式,标志将被覆盖其目的,因此请删除launchermode并尝试您一定会得到它

答案 8 :(得分:1)

试试这个

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

答案 9 :(得分:0)

如果我们使用此代码启动Login活动(A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

活动应该在活动堆栈中,否则此标志将不起作用。

如果我们在登录活动(A)中使用finish(),则在启动活动(B)之后(为了避免从B返回A),活动A(登录)将不在堆栈中。当登录活动具有&#34; noHistory&#34;时,恰好相同。作为属性。

所以,我的解决方案是其他回应的混合:

此代码进入活动B,以避免返回登录活动:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}

此代码进入调用注销函数的活动:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}