完成活动前开始的所有活动

Posted

技术标签:

【中文标题】完成活动前开始的所有活动【英文标题】:Finishing all activities started before the activity 【发布时间】:2011-09-06 20:59:32 【问题描述】:

我想完成应用程序中正在运行的所有活动意味着想从堆栈中删除所有父活动。

我想在我的应用程序中本地实现注销功能,所以我的想法是,我将完成之前开始的所有活动,然后再次开始登录活动..

【问题讨论】:

【参考方案1】:

如果你的目标是 APi Level ,试试这个

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

【讨论】:

这是最好的答案,我们应该给这个评分。【参考方案2】:

您可能正在寻找 FLAG_ACTIVITY_CLEAR_TOP 意图标志:

如果设置了,并且正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且此 Intent 将被传递到(现在在顶部)作为新 Intent 的旧活动。

Intent i = new Intent(..);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后以此意图启动 Activity。

在文档中查看有关任务和返回堆栈的更多信息:Tasks and Back stack。

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

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

例如检查Password Safe 应用程序源。每次打开新的应用程序实例时都需要密码。

【讨论】:

嗨,吉尔,我试过了,但这不起作用,它显示了之前调用的所有活动。我还缺少什么? 所以实际上我发现主题和解释有点混乱:在主题中你想在开始新活动之前完成所有开始,而解释建议杀死你的应用程序。你能详细说明一下吗?【参考方案3】:

我应该让你知道这不是 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();
    

希望这会有所帮助。

【讨论】:

还没有成功..还有什么建议吗?实际上我想在我的应用程序中实现注销功能.. 嗨 Pooja,我使用第一块代码返回到我在项目中的第一个活动。我想你也可以用它来返回登录屏幕? 是的,我明白,但是当我这样做时,在设备的后退键上会显示最后打开的活动。 哦...我遇到了问题。实际上,一旦用户成功登录应用程序,我就完成了登录活动。所以你给出的代码不起作用。但我必须在成功登录后完成登录活动。如何做到这一点?请帮忙。 @Pooja 可以尝试使用第二段代码,可以把bundle.putBoolean("logout", true),然后在MainMenuActivity的onResume()中检查bundle。如果 bundle == "logout",则完成 MainMenuAcitvity 并启动 LoginActivity ...我认为这不是一个聪明的方法,下班后给我一些时间,我会想出一个更好的方法。希望这会有所帮助:)

以上是关于完成活动前开始的所有活动的主要内容,如果未能解决你的问题,请参考以下文章

简练软考知识点整理-排列活动顺序

Android,完成所有活动

敏捷21天打卡--Scrum活动

如何从子活动完成父活动

项目管理20 | 项目进度管理-排列活动顺序

完成活动是不是会破坏从活动创建的线程?