【问题标题】:How to clear the Android Stack of activities?如何清除 Android Stack 的活动?
【发布时间】: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);

我也自己尝试过。

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

【问题讨论】:

标签: android android-activity stack 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 个活动。这可能是内存不足错误的原因吗?我应该怎么做才能修复它?谢谢!
          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2017-03-12
          • 2016-04-15
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多