如何清除Android的活动堆栈?
我有一个在Android中有几个活动的应用程序,我希望用户能够通过按下菜单按钮来注销。我的问题是 A) 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
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);