6

我已经为我的问题寻找解决方案很长时间了,但是 Android 文档不是很清楚,网络解决方案也不能完全工作。

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

  1. 如果用户点击 Home 按钮然后返回游戏,必须停止并恢复活动,而不通过 onDestroy(否则会丢失游戏状态)
  2. 当主Activity调用另一个Activity然后返回游戏时,同样的功能。
  3. 当用户按下退出按钮时,游戏必须完全退出

对于前两点,我尝试这样做以确保创建和调用一个且只有一个主 Activity:android:launchMode="singleTask"或者android:launchMode="singleTop"但不幸的是,第一个适用于第一个问题,第二个适用于第二个问题,而不适用于两者!

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

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

对于第三点,我尝试将 Activity 添加android:noHistory="true"到每个 Activity,然后当用户单击退出按钮时,我调用一个新的 Activity,它除了 onCreate 上的方法之外什么都不做finish(),这个 Activity 被调用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);并且它的 launchMode 是singleInstance,但它没有t 工作,它只是总是在主 Activity 中返回。

4

1 回答 1

3

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

Android 可以(并且将会)随时终止您的进程(尤其是当您的应用程序在后台时)。因此,您需要将游戏状态保存在 中onPause(),因为这是保证您拥有的唯一机会。

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

对于您的第三点,有几个选项:

  1. 您可以在此处startActivityForResult()查看我的回答开始所有活动
  2. 当你想“退出”时,你可以回到你的根活动(启动你的应用程序的那个)并告诉它你想退出。

像这样:

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();
}
于 2012-10-23T20:11:28.363 回答