完成在该活动之前启动的所有活动

6

我希望完成应用程序中正在运行的所有活动,即要从堆栈中删除所有父活动。

我想在我的应用程序中本地实现注销功能,所以我在考虑,我将结束之前启动的所有活动,并重新开始登录活动。

3个回答

8

我应该让你知道,在Android中这不是推荐的行为,因为你应该让自己来管理活动的生命周期。

然而,如果你真的需要这样做,你可以使用FLAG_ACTIVITY_CLEAR_TOP

我在这里提供一些示例代码,其中MainActivity是应用程序中的第一个活动

public static void home(Context ctx) {
    if (!(ctx instanceof MainMenuActivity)) {
        Intent intent = new Intent(ctx, MainMenuActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        ctx.startActivity(intent);
    }
}

如果你想退出整个应用程序,可以使用以下代码,并在MainActivity中检查以完全退出应用程序:

    public static void clearAndExit(Context ctx) {
    if (!(ctx instanceof MainMenuActivity)) {
        Intent intent = new Intent(ctx, MainMenuActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        Bundle bundle = new Bundle();
        bundle.putBoolean("exit", true);
        intent.putExtras(bundle);
        ctx.startActivity(intent);
    } else {
        ((Activity) ctx).finish();
    }
}

希望这能帮助到您。

1
还没有成功。还有什么建议吗?实际上,我想在我的应用程序中实现注销功能。 - Pooja M. Bohora
嗨Pooja,我使用了第一个代码块来返回到我的项目中的第一个活动。我认为你也可以用它来返回到登录界面,对吧? - ThinkChris
是的,我明白,但是当我这样做时,在设备的返回键上它会显示最后打开的活动。 - Pooja M. Bohora
哦...我明白问题了。实际上,我是在用户成功登录应用程序后完成登录活动的。所以你给出的代码不起作用。但是我必须在成功登录后完成登录活动。如何实现这一点?请帮忙。 - Pooja M. Bohora
@Pooja 你可以尝试使用第二个代码块,将bundle.putBoolean("logout", true)放在里面,然后在MainMenuActivity的onResume()方法中检查bundle。如果bundle等于"logout",那么就结束MainMenuActivity并启动LoginActivity...我认为这不是一个聪明的方法,下班后给我一些时间,我会想出更好的方法。希望能帮到你:) - ThinkChris
你好,但我在这里没有使用bundle。你能告诉我关于它的信息吗? - Pooja M. Bohora

3
如果您的目标是API级别低于11,请尝试使用这个。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

1
这是最好的答案,我们应该给它评分。 - Gem

2
你可能正在寻找的是 FLAG_ACTIVITY_CLEAR_TOP 意图标志:
如果设置了该标志,并且要启动的活动已经在当前任务中运行,则不会启动该活动的新实例,而是将其上面的所有其他活动都关闭,并将该意图作为新意图交付给 (现在在顶部的) 旧活动。
Intent i = new Intent(..);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后使用此意图启动活动。

有关任务和返回堆栈的更多信息,请参见文档:任务和返回堆栈

但是,要实现应用程序的登录/注销(如果它没有与在线服务通信),您可以使用SharedPreferences。这样,在应用程序启动时,您可以检查用户是否已登录(例如,在偏好设置中打开了某个标志),并在应用程序退出时(例如,通过按钮),您可以清除此标志。

杀死/删除活动应留给系统。按系统设计,Android操作系统负责应用程序的生命周期。

例如,检查密码保险箱应用程序源。每次打开新的应用程序实例时,它都需要密码。


嗨Gil,我尝试了这个,但它不起作用,它向我展示了之前调用过的所有活动。我还错过了其他什么吗? - Pooja M. Bohora
其实我觉得这个主题和解释有点混淆了:在主题中,你想要在开始新活动之前先完成所有已经开始的事情,而解释则建议结束应用程序。你能详细说明一下吗? - Marcin Gil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接