如何清除Android Stack的活动?
我有一个应用程序与Android中的几个活动,我希望用户能够通过按菜单button注销。 我有这个问题是
答)Android不会让你终止应用程序
B)即使我再次将用户发送到LoginActivity
,他们也可以总是按回来,并返回到之前的活动。
我已经尝试使用以下两个标志启动活动:
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()
之后调用finish()
,因为我在另一个StackOverflow问题中读到。
在您的login活动中,重写后退button,以便隐藏您的应用程序而不是完成活动:
@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分钟后不会清除您的堆栈(包括login活动)。
然后在成功login时调用finish()。
这应该按位OR'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);
按照Wakka 从历史堆栈中移除活动 …
将android:noHistory="true"
属性添加到AndroidManifest.xml
中的<activity>
中,如下所示:
<activity android:name=".MyActivity" android:noHistory="true"> </activity>
如果您使用Android API 11
或更高版本,则可以使用以下代码清除堆栈。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
这不会清除你的活动回来堆栈。
即使按照上面所有的答案,当我按下后退button它显示了closures应用程序之前一秒的最后一个活动。
这就是我所做的:
@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); }
现在我的应用程序退出后按下:)没有任何麻烦。
设置Intent.FLAG_ACTIVITY_CLEAR_TOP
已经为我工作在一个非常相似的情况下,我没有设置Intent.FLAG_ACTIVITY_NEW_TASK
标志。 你有没有试过?
这个工作对我来说:)
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
我不知道是不是好:)但工程。
Intent intent = new Intent(this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
写这个并注意: LoginActivity
必须首先作为启动器和
如果你写了任何启动模式的标志覆盖其目的,所以删除启动模式,并尝试你一定会得到它
尝试这个
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);
如果我们使用此代码启动login活动(A):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
该活动应该在活动的堆栈中,否则这个标志不会有任何影响。
如果我们在login活动(A)中使用了finish(),那么在启动活动(B)(为了避免从B返回到A)之后,活动A(login)将不在栈中。 当login活动具有“noHistory”属性时,完全相同。
所以,我的解决scheme是其他答案的混合:
该代码进入活动B,以避免回到login活动:
@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); }