Android:使用singleTop或SingleTask恢复活动

时间:2012-10-22 22:28:49

标签: android android-intent android-activity

我已经在很长一段时间内一直在寻找有关我的问题的解决方案,但Android文档并不是那么清晰,而且网络解决方案也无法完全发挥作用。

我正在开发一款游戏,其中主要的Activity(游戏发生的地方)可以调用另一个简单的Activity而不是返回。 它会像这样工作:

  1. 如果用户单击“主页”按钮然后返回游戏,则必须停止活动,然后在不通过onDestroy的情况下恢复活动(否则会丢失游戏状态)
  2. 当主Activity调用另一个Activity然后返回游戏时的相同功能。
  3. 当用户按下退出按钮时,游戏必须全部退出
  4. 前两点我尝试了这一点,以确保创建并调用了一个且只有一个主要活动:android:launchMode="singleTask"android:launchMode="singleTop"但不幸的是,第一个问题适用于第一个问题而第二个问题适用于第二个,不是两个!

    我认为问题是:使用singleTop时,当第二个活动调用它时,主Activity实际上不在堆栈的顶部(要清楚,我不明白应该是什么情况,我称之为已经位于堆栈顶部的活动!)。相反,singleTask确保Activity在其堆栈中是唯一的,但是在用户单击Home按钮并返回到Application后,其他任务被调用,我是对的吗?

    无论如何,这是一个聪明的解决方案,还是我应该在onStop / onPause中保存我的游戏状态,然后在onResume中恢复它?

    对于第三点,我尝试将android:noHistory="true"添加到每个Activity,然后当用户单击退出按钮时,我调用一个新的Activity,它只对onCreate上的finish()方法执行任何操作,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);调用活动,其launchMode为singleInstance,但它不起作用,它只是在主Activity中返回。

1 个答案:

答案 0 :(得分:3)

你绝对不想弄乱launchMode。这不是解决这个问题的方法,只会给你带来更多问题。

Android可以(并且会)随时杀死您的进程(但特别是如果您的应用程序在后台)。因此,您需要在onPause()中保存游戏状态,因为这是您保证的唯一机会。

无论如何,如果您将游戏保存在onPause()中,标准行为将覆盖您的前2个点。

对于你的第3点,有几个选择:

  1. 您可以使用startActivityForResult()查看我的回答here
  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()

    Intent intent = getIntent();
    if (intent.hasExtra("exit")) {
        // User wants to exit
        finish();
    }
    
相关问题