安卓:launchMode=SingleTask问题

5
我有一个围绕主活动(主菜单)的应用程序。在每个其他应用程序中,都有一个选项菜单项,指向此活动。
起初,当选择此项时,我总是启动新的主活动。使用意图包,我告诉主活动一些初始化在新开始时不需要。
然而,我并不太喜欢整体行为。我偶然发现了android:launchMode="SingleTask",这似乎有所帮助:现在我不会一直重新创建我的主菜单活动;而且,如果我按“返回”按钮,我会直接回到主屏幕。这感觉非常像一个适当的“主”菜单。
我现在的问题是:如果我运行我的应用程序的另一个活动,按下主页按钮,然后重新打开我的应用程序(例如使用“最近的应用程序”),那么我不会返回到上一个活动,而是返回到主要的活动。另一个活动被销毁了。
有什么想法可以实现SingleTask的行为,而不仅仅能够返回到一个活动?

很高兴你找到了解决问题的方法。对于未来的读者,我认为这里的根本原因与被接受的答案所述的不相关,而实际上是在这里解释的“bug”:https://dev59.com/v3E95IYBdhLWcg3wMa91 - eselk
3个回答

3
如果你在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,它将使现有的主活动处于前台。标志Intent.FLAG_ACTIVITY_CLEAR_TOP将删除在主活动顶部的所有活动。(我假设您在同一应用程序内)。

现在,您的所有其他活动只需要包含一个按钮,其单击监听器调用方法goHome();

从您的主活动中,如果按下硬件返回按钮,则应退出您的应用程序。


1
我实际上想要正常的行为。然而,如果我将我的主活动声明为单个任务,则如果我按下主屏幕按钮,其他活动将被销毁。我想要实现的是a)通过菜单快速链接到主活动,而无需重新创建主应用程序,并且b)通过在主活动中按下返回按钮来“关闭”整个应用程序。(关闭意味着与主屏幕按钮相同的效果。)但是,b)只是一个很好的选择,所以我主要想实现a)。 :-) - jellyfish
现在我明白你的意思了。请看我上面编辑过的答案。一定要清楚地表明你是在谈论硬件返回按钮还是软件返回按钮。 - codinguser
非常感谢!那正是我在寻找的。我也会记住你的建议,以备将来之需。 :-) - jellyfish

0
为什么不在由主活动创建的活动上调用finish()方法?这样你就可以返回到主活动,而不需要创建一个新的活动...

听起来不错,但是有时候在我的实际活动和主要活动之间可能会有多个活动。有没有办法可以关闭它们之间的所有活动? - jellyfish
可能有更好的解决方案,但是当调用onActivityResult时,您可以通过调用finish()方法来关闭活动。您可以在顶层活动上设置一些结果标志,例如“CLOSE”,底层活动将处理关闭操作。流程将如下进行:A创建B,B创建C。现在C通过结果“CLOSE”调用finish()方法,B在onActivityResult中获取结果代码,并通过调用finish()方法自行关闭。 - Daniel Novak

0

我很乐意这样做,但我不知道如何在不返回整个Activity堆栈的情况下恢复我的主活动。 - jellyfish

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