我在Android中有一个包含多个活动的应用程序,我希望用户能够通过按菜单按钮注销。我遇到的问题是
A)Android不允许您终止应用程序和
B)即使我再次将用户发送到LoginActivity
,他们也可以随时按返回并直接回到之前的活动。
我已经尝试使用以下两个标志启动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中读到时,我也尝试在finish()
之后调用startActivity(intent)
问题
答案 0 :(得分:42)
这应该是按位OR,否则你最终会覆盖之前的标志。
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);
答案 1 :(得分:35)
在您的登录活动中,覆盖后退按钮,以便隐藏您的应用而不是完成活动:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
还要确保在root活动上设置android:alwaysRetainTaskState =“true”,这样Android在用户不活动30分钟后就不会清除你的堆栈(包括登录活动)。
然后在成功登录时调用finish()。
答案 2 :(得分:31)
根据Wakka中的Removing an activity from the history stack ...
将android:noHistory="true"
属性添加到<activity>
中的AndroidManifest.xml
,如下所示:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
答案 3 :(得分:6)
如果您使用Android API 11
或更高版本,则可以使用以下代码清除堆栈。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
答案 4 :(得分:5)
这不会清除您的活动后筹码。
即使在完成上述所有答案后,当我按下后退按钮时,它会在关闭应用程序之前显示最后一次活动。
这就是我所做的:
@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);
}
现在我的应用程序退出了,没有任何麻烦。
答案 5 :(得分:3)
设置Intent.FLAG_ACTIVITY_CLEAR_TOP
对我来说非常类似,我没有设置Intent.FLAG_ACTIVITY_NEW_TASK
标志。你没试过吗?
答案 6 :(得分:2)
这项工作对我来说:)
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是我的根活动,例如
我有活动A - &gt; B - &gt; C - &gt; D当我在堆栈上调用启动活动E时,我现在有了A - &gt; ë
我不知道这是好事:)但是有效。
答案 7 :(得分:1)
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
写下并注意:LoginActivity
必须首先作为Launcher和
如果您编写任何启动器模式,标志将被覆盖其目的,因此请删除launchermode
并尝试您一定会得到它
答案 8 :(得分:1)
试试这个
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);
答案 9 :(得分:0)
如果我们使用此代码启动Login活动(A):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
活动应该在活动堆栈中,否则此标志将不起作用。
如果我们在登录活动(A)中使用finish(),则在启动活动(B)之后(为了避免从B返回A),活动A(登录)将不在堆栈中。当登录活动具有&#34; noHistory&#34;时,恰好相同。作为属性。
所以,我的解决方案是其他回应的混合:
此代码进入活动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);
}