54

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

我也亲自尝试过他们每个人。

finish()startActivity(intent)我阅读另​​一个 StackOverflow 问题时,我也尝试过打电话。

4

10 回答 10

42

这应该是按位或,否则您最终会覆盖较早的标志。

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);
于 2010-12-02T19:09:45.177 回答
36

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

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

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

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

于 2010-11-16T03:14:27.380 回答
31

根据Wakka从历史堆栈中删除活动...


android:noHistory="true"像这样将属性添加到您<activity>AndroidManifest.xml

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>
于 2012-08-22T14:59:19.390 回答
6

如果您使用Android API 11或以上,您可以使用以下代码清除堆栈。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
于 2012-03-03T01:53:38.680 回答
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);
}

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

于 2013-07-16T09:31:29.770 回答
3

Intent.FLAG_ACTIVITY_CLEAR_TOP在一个非常相似的情况下,设置对我有用,我没有设置标志Intent.FLAG_ACTIVITY_NEW_TASK。你试过没有吗?

于 2010-11-16T04:28:54.043 回答
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 是我的根活动

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

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

于 2012-12-17T11:06:03.173 回答
1
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

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

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

于 2012-05-21T17:36:43.297 回答
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);
于 2015-01-06T08:55:04.120 回答
0

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

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

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

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

所以,对我来说,解决方案是其他反应的混合:

此代码进入活动 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);
}
于 2014-07-25T11:14:04.437 回答