我有一个在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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top