如何清除 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 中删除所有活动 [重复]