如何清除Android的活动堆栈?

如何清除Android的活动堆栈?,android,android-activity,stack,back-stack,Android,Android Activity,Stack,Back Stack,我有一个在Android中有几个活动的应用程序,我希望用户能够通过按下菜单按钮来注销。我的问题是 A) Android不允许您终止应用程序,并且 B) 即使当我再次将用户发送到LoginActivity时,他们也可以随时按back并返回到之前的活动 我已尝试使用以下两个标志启动活动: Intent intent = new Intent(this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); int

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

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

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

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);
我也试着让每一个都自己去做

当我在另一个StackOverflow中阅读时,我还尝试在
startActivity(intent)
之后调用
finish()

问题。

在您的登录活动中,覆盖“后退”按钮,使其隐藏您的应用程序,而不是完成活动:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}
还要确保在根活动上设置android:alwaysRetainTaskState=“true”,这样在用户不活动30分钟后,android不会清除堆栈(包括登录活动)


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

设置
Intent.FLAG\u ACTIVITY\u CLEAR\u TOP
在一个非常类似的情况下对我有效,我没有设置
Intent.FLAG\u ACTIVITY\u NEW\u TASK
标志。您是否尝试过不使用?

这应该是按位或d,否则您将覆盖先前的标志

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);

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
写下并注意:
LoginActivity
必须首先作为启动器和

如果您编写任何启动程序模式,则标志会被其用途覆盖,因此请删除
启动程序模式
,然后重试,您肯定会按照中的说明获得它


android:noHistory=“true”
属性添加到
AndroidManifest.xml中的
,如下所示:

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

这是我的工作:)

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

我有活动A->B->C->D,当我调用堆栈上的开始活动E时,我现在有了A->E

我不知道它是否好:)但有效。

这无法清除您的活动

即使在遵循了以上所有答案之后,当我按下后退按钮时,它也会在关闭应用程序之前的一秒钟内显示最后一个活动

这就是我所做的:

@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);
}

现在,我的应用程序在按back press:)时退出,没有任何麻烦。

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

该活动应位于活动堆栈中,否则此标志将不起任何作用

如果我们在登录活动(A)中使用finish(),则在启动活动(B)之后(为了避免从B返回A),活动A(登录)将不在堆栈中。当登录活动的属性为“noHistory”时,也会发生完全相同的情况

因此,对我来说,解决方案是混合其他反应:

此代码位于活动B中,以避免返回登录活动:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
@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);
}
试试这个

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);

您必须在清单中将您的活动声明为singleinstance。与感谢类似,您的代码使我走上了正确的道路,但这也会起到同样的作用:@Override public void onBackPressed(){moveTaskToBack(true);}好的,因此我有一个用户不断在活动之间切换,这意味着他们可能在20秒内切换了15项活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢我已经试了很多次了,但没有达到要求的效果。请帮助我唯一有效的方法是,如果您尝试启动的活动已经在活动堆栈中。Android你这么奇怪?API级别<11时,这不起作用。检查my是否有符合API级别>=1的解决方案。好的,我让一个用户在活动之间不断切换,这意味着他们可能在20秒内切换了15个活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢请记住,在比较答案时,Froyo和Cupcake的SDK版本之间发生了很大的变化。换句话说,在2010年以某种方式运作的东西现在可能会不同。是的,你是对的。我会记住的。谢谢。好的,我有一个用户经常在活动之间切换,这意味着他们可能在20秒内切换了15个活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢完美的这是simpleOkay,所以我有一个用户在活动之间不断切换,这意味着他们可能在20秒内切换了15个活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢好的,我有一个用户经常在活动之间切换,这意味着他们可能在20秒内切换了15个活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢@它不应该导致记忆丧失。可能是某些东西使您的活动留在内存中:)检查:
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);