Android: resume an Activity with singleTop or SingleTask
我一直在寻找有关问题的解决方案,但是Android文档并不十分清楚,并且Web解决方案无法完全正常工作。
我正在开发一款游戏,其中主要的Activity(在其中进行游戏)可以调用另一个简单的Activity,而不是返回。
它将像这样工作:
如果用户单击"主页"按钮然后返回到游戏,则必须停止该活动,然后在未通过onDestroy的情况下继续进行该活动(否则它将丢失游戏状态)
当主Activity调用另一个Activity然后返回游戏时,具有相同的功能。
当用户按下退出按钮时,游戏必须完全退出
对于前两点,我尝试确保创建并调用了一个主活动:android:launchMode="singleTask"或android:launchMode="singleTop",但不幸的是,第一个问题适用于第一个问题,第二个问题适用于第二个问题,不适用于两个问题!
我认为问题是:使用singleTop时,当第二个活动调用主活动时,主活动实际上并没有位于堆栈的顶部(要明确的是,我不知道在什么情况下调用活动是已经在堆栈顶部!)。相反,singleTask确保活动在其堆栈中是唯一的,但是在用户单击"主页"按钮并返回到应用程序之后,另一个任务称为"任务",对吗?
无论如何,这是一个聪明的解决方案,还是我应该将游戏状态保存在onStop / onPause中,然后在onResume中恢复呢?
对于第三点,我尝试将android:noHistory="true"添加到每个Activity中,然后当用户单击退出按钮时,我调用一个新的Activity,该onOnCreate方法仅对onCreate的finish()方法起作用,因此使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);调用此Activity并且其launchMode为singleInstance,但是它不起作用,它只是总是在主Activity中返回。
您绝对不想弄乱launchMode。 那不是解决这个问题的方法,只会给您带来更多的问题。
Android可以(并且将)随时终止您的进程(但特别是如果您的应用程序在后台)。 因此,您需要将游戏状态保存在onPause()中,因为这是您唯一拥有的机会。
无论如何,如果将游戏保存在onPause()中,则标准行为将覆盖您的前2分。
对于第三点,有几种选择:
您可以使用startActivityForResult()开始所有活动,在此处查看我的答案
当您要"退出"时,您可以返回到根活动(启动应用程序的活动)并告诉您要退出。
像这样:
1 2 3 4
| Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack
intent.addExtra("exit","true"); // this tells your root activity that you want to exit
startActivity(intent); |
现在,您要在MyRootActivity中将此代码添加到onCreate():
1 2 3 4 5
| Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// User wants to exit
finish();
} |
-
感谢您的回答。对于前两点,我使用android:launchMode =" singleTask"解决了,并删除了android:noHistory =" true"(我认为这是真正的问题)。将状态保存在onPause()上可以是一种选择,但是如何保存Activity的UI外观?关于第三点...这正是我使用的解决方案,但是没有起作用,因为另一个任务上有主要的Activity。我解决了在根活动上调用finish()的问题,然后检查主Activity的onResume()是否设置了"退出"标志,在这种情况下,我立即调用finish()。
-
您不需要使用launchMode="singleTask"。标准启动模式将满足您的需求。如果没有,那么您正在做其他错误。您的整个应用程序应该在一个任务中运行,而不是在多个任务中运行。没有理由。
-
我同意,但这不是我的错,问题是Google的疯狂选择!我希望主活动始终是一个且只有一个(除非极少出现内存不足的情况,否则不得销毁该活动),并且该活动不能位于堆栈的顶部。因此,经典的launchMode创建了我的活动的多个实例,singleTop仅在活动位于顶部时才恢复活动,但是如果我从另一个活动中调用它,我将无法理解它会在顶部!
-
如果您要获取主要活动的多个实例,那么您做错了什么。说明在哪里获得多个实例以及在这些情况下如何启动活动。
-
您应该将状态保存在onSaveInstanceState中而不是onPause中