Android:使用singleTop或SingleTask恢复活动

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();
    }