Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:launchMode=单任务问题_Java_Android_Android Activity_Launchmode - Fatal编程技术网

Java Android:launchMode=单任务问题

Java Android:launchMode=单任务问题,java,android,android-activity,launchmode,Java,Android,Android Activity,Launchmode,我有一个围绕主要活动(主菜单)的应用程序。在每个其他应用程序中都有一个指向此活动的选项菜单项 起初,我总是在选择此项目时启动一个新的主活动。使用intent包,我确实告诉了主要活动,我在一个新的开始上所做的一些初始化是不必要的 然而,我不太喜欢整体行为。我偶然发现了android:launchMode=“SingleTask”,这似乎有所帮助:现在我不再总是重新创建主菜单活动;此外,如果我按下“后退”按钮,我会直接返回主屏幕。这感觉很像一个合适的“主”菜单 我现在的问题是:如果我运行我的应用程序

我有一个围绕主要活动(主菜单)的应用程序。在每个其他应用程序中都有一个指向此活动的选项菜单项

起初,我总是在选择此项目时启动一个新的主活动。使用intent包,我确实告诉了主要活动,我在一个新的开始上所做的一些初始化是不必要的

然而,我不太喜欢整体行为。我偶然发现了android:launchMode=“SingleTask”,这似乎有所帮助:现在我不再总是重新创建主菜单活动;此外,如果我按下“后退”按钮,我会直接返回主屏幕。这感觉很像一个合适的“主”菜单

我现在的问题是:如果我运行我的应用程序的另一个活动,按home按钮,然后重新打开我的应用程序(例如使用“上一个应用程序”),那么我不会返回到上一个活动,而是返回到主活动。另一个活动被破坏


你知道我如何在不返回一个活动的情况下实现
SingleTask
的行为吗?

为什么不对主活动创建的活动调用finish()?通过这种方式,您可以返回到主活动,而无需创建新活动…

我认为您应该在开始另一个活动之前保存活动的状态,然后在每次返回上一个活动时恢复活动。 请参阅Android的活动生命周期

如果您的其他活动在Android中以活动默认值正常声明,那么返回应用程序应该会将您带到您停止的相同活动(使用硬件主页按钮)

但是请记住,Android系统在需要系统资源时会杀死应用程序。因此,当您转到其他应用程序时,您的应用程序可能已被终止。然后,当您返回应用程序时,默认的启动程序活动将重新启动,这是您的菜单活动

要从任何活动返回到主活动,请执行以下操作:

public static void goHome(Context context) {
        final Intent intent = new Intent(context, HomeActivity.class); //give name of your main activity class here
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
    }
这将清除活动堆栈并使您返回到主要活动。正如您声明的singleTop一样,它将把现有的主活动带到前台。flag Intent.flag_ACTIVITY_CLEAR_TOP将删除主活动顶部堆栈中的所有活动。(我假设您在同一个应用程序中)

现在,所有其他活动只需要包含一个按钮,其click listener调用方法
goHome()


从您的主要活动中,如果您按下硬件后退按钮,它将退出您的应用。

听起来不错,但有时我的实际活动和主要活动之间会有多个活动。是否有一种方法可以关闭这两者之间的所有活动?可能有更好的解决方案,但可以在调用onActivityResult时通过调用finish()来关闭活动。您可以在顶部活动上设置一些结果标志,如“关闭”,而底层活动将处理关闭。它是这样的,A创建了B,B创建了C。现在C调用finish,结果为“CLOSE”,B在onActivityResult中获取结果代码,并通过调用finish来关闭自己……我很乐意这样做,但我不知道如何在不返回所有活动堆栈的情况下恢复我的主要活动。我实际上希望有正常的行为。但是,如果我将我的主要活动声明为单个任务,那么如果我按下“主页”按钮,其他活动将被销毁。我想要实现的是a)通过菜单快速链接到主活动,而无需重新创建主应用程序;b)通过按主活动中的“后退”按钮“关闭”整个应用程序。(关闭意味着与主页按钮相同的效果。)然而,b)只是一个很好的选择,所以我主要希望实现a。):-)现在我明白你的意思了。请参见上面我编辑的答案。一定要弄清楚你说的是硬件后退按钮还是软件后退按钮。非常感谢!这正是我想要的。我将来也会记住你的建议。:-)很高兴您找到了解决问题的方法。对于未来的读者来说,我认为这里的根本原因与公认的答案的状态无关,而是这里解释的“bug”: