如何清除 Android Stack 的活动?

Posted

技术标签:

【中文标题】如何清除 Android Stack 的活动?【英文标题】:How to clear the Android Stack of activities? 【发布时间】:2011-05-10 13:53:16 【问题描述】:

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

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

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

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

我也自己尝试过。

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

【问题讨论】:

您必须在清单中将您的活动声明为单实例。 类似于Android: Clear the back stack 【参考方案1】:

这对我有用:)

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

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

【讨论】:

好的,所以我有一个用户经常在活动之间切换,这意味着他们可能在 20 秒内切换了 15 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!' @RuchirBaronia 它不应该导致内存不足。可能有什么东西让你在记忆中活动:) 检查:blogs.innovationm.com/…【参考方案2】:

如果我们使用此代码启动登录活动 (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);

【讨论】:

【参考方案3】:

根据Wakka in Removing an activity from the history stack...


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

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

【讨论】:

完美!这很简单【参考方案4】:

这不会清除您的活动回栈。

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

这就是我所做的:

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

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

【讨论】:

请记住,在比较答案时,Froyo 和 Cupcake 的 SDK 版本之间发生了很大变化。换句话说,在 2010 年以某种方式起作用的东西现在可能会有所不同。 是的,你是对的。我会记住这一点。谢谢。 好的,所以我有一个用户经常在活动之间切换,这意味着他们可能在 20 秒内切换了 15 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!【参考方案5】:

试试这个

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

【讨论】:

好的,所以我有一个用户经常在活动之间切换,这意味着他们可能在 20 秒内切换了 15 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!【参考方案8】:
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

写下这个并注意:LoginActivity 必须首先作为 Launcher 启动,然后

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

【讨论】:

【参考方案9】:

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

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 级别 answer 以获得符合 API 级别 >= 1 的解决方案。 好的,所以我有一个用户经常在活动之间切换,这意味着他们可能在 20 秒内切换了 15 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!【参考方案10】:

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

@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()。

【讨论】:

谢谢,您的代码让我走上了正确的道路,但这将起到同样的作用:@Override public void onBackPressed() moveTaskToBack(true); 好的,所以我有一个用户经常在活动之间切换,这意味着他们可能在 20 秒内切换了 15 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!

以上是关于如何清除 Android Stack 的活动?的主要内容,如果未能解决你的问题,请参考以下文章

在调用新活动时从 Back Stack 中删除所有活动 [重复]

如何在Android中清除以前打开的活动

如何清除从 Android 中点击通知打开的先前活动?

如何使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 清除 Activity Stack?

Android:清除活动堆栈

我怎样才能在android中实现wifi直接活动?