如何清除Android活动?
-
10-10-2019 - |
题
我有一个在Android中进行的活动的应用程序,希望用户能够通过按菜单按钮来注销。我的问题是
a)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);
我还自己尝试了每个人。
我也尝试打电话 finish()
后 startActivity(intent)
正如我在另一个Stackoverflow问题中阅读的那样。
解决方案
在您的登录活动中,覆盖后按钮,因此它隐藏了您的应用程序而不是完成活动:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
另外,请确保在根活动上设置Android:lovelyRetaintAskState =“ true”,因此Android在与用户的不活动30分钟后不会清除您的堆栈(包括登录活动)。
然后只需在成功登录时调用饰面()即可。
其他提示
这应该是位或',否则您最终会覆盖早期的标志。
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"
归因于您 <activity>
在里面 AndroidManifest.xml
像这样:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
如果您正在使用 Android API 11
或以上,您可以使用以下代码清除堆栈。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
这不会清除您的活动后堆栈。
即使遵循上述所有答案,当我按下后面按钮时,它在关闭应用程序之前显示了最后一秒钟的活动。
这就是我所做的:
@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-> b-> c-> d当我在堆栈上调用开始活动E时,我现在有A-> e
我不知道这很好:)但是有效。
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
写这件事并注意: LoginActivity
必须首先作为启动器启动
如果您编写任何发射器模式,则标志被覆盖了其目的,因此请删除 launchermode
并尝试您一定会得到它
尝试这个
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);
如果我们使用此代码启动登录活动(a):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
该活动应在一堆活动中,否则该标志将不会产生任何影响。
如果我们在登录活动(a)中使用finish(a)中的finish(a),在启动活动(b)(避免回到b)之后,活动a(登录)(登录)将不在堆栈中。当登录活动具有“无历史”为属性时,就会发生同样的情况。
因此,对我的解决方案是其他回答的混合:
该代码在活动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);
}