8

对于在线游戏,很高兴知道 AndroidActivity的 onDestroy() 是否仅因为 Android 将重新创建它(例如设备旋转)或用户选择退出游戏而被调用。

我的计划是在 Android 可能正在重新创建时在Activity's中设置一个标志:onSaveInstanceState()Activity

private boolean mDestroyedForReCreation;
...
protected void onSaveInstanceState() {
    ...
    mDestroyedForReCreation = true;
}

如果你这样做了,你可以签mDestroyedForReCreationonDestroy()

  • 如果设置了标志 (true),请不要将用户从在线游戏中解散。
  • 如果该标志未设置(假),则将用户从在线游戏中移除,因为他确实自愿退出了游戏。

这是一个正确的方法吗?如果是,是否推荐或有更好的解决方案?我希望如此,因为我真的不喜欢那个解决方案......

4

6 回答 6

5

I suggest you to remove such kind of game logic from activity's life cycle. Create a Service. If no one binded - all activities are dead. Is someone binded - keep working.

If you do not want to create service, you can use onRetainNonConfigurationInstance method. Here is example.

You should use onRetainNonConfigurationInstance because it is called by the system, as part of destroying an activity due to a configuration change, when it is known that a new instance will immediately be created for the new configuration. onSaveInstanceState called when android going to kill activity and maybe restore it sometimes or maybe not ).

于 2013-01-23T10:06:17.590 回答
3

您可以通过代码处理此配置更改来简单地避免轮换重新启动。你可以这样做Manifest.xml

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
    android:label="@string/app_name" >

因此,如果键盘打开/关闭,您的应用将不会在旋转时重新启动。

我认为这个解决方案要简单得多。

在这种情况下,您几乎不需要处理onSaveInstanceState()退出,除非您开始另一个需要保存游戏状态的意图/活动。请注意,电话也会中断您的代码。我知道一些有有趣错误的游戏,其中时间重置但分数不重置。

于 2013-01-23T12:44:06.060 回答
2

我只想简化整个事情,并设置一个在用户退出游戏时切换的标志,例如:

void exitGame() {
   mUserExited = true;
   finish();
}

(或者,如果您需要销毁多个活动,您可能需要更多逻辑)

然后检查 onDestroy() 中的标志。

无论您对配置更改(旋转等)有什么逻辑,都与退出游戏标志无关。

另外,请记住,“后退”按钮的默认行为是完成()当前活动(如果上面没有其他活动)——在这种情况下,这不会算作“退出”。这里的行为取决于你。

于 2013-01-29T13:14:05.720 回答
2

Activity有一个名为isFinishing()的方法,这可能是您正在寻找的。

请参阅:https ://stackoverflow.com/a/9621078/445348

于 2013-01-29T20:39:21.863 回答
1

如果您需要知道这一点,您应该考虑自己处理轮换和其他配置更改事件,而不是让系统来处理。如果您在清单中设置活动处理 configChanges,它将在旋转时调用 onConfigChange,而不是销毁和重新创建活动。大量的应用程序都这样做了,Android 所做的整个循环破坏和重建是绝对迟钝的。

于 2013-01-21T05:14:47.607 回答
0

onRestoreInstanceState() 如果在恢复 /recreated 时将被调用,如果活动被 android 杀死,它会保存其活动 UI 状态和一些值,你可以覆盖 onSaveInstanceState 但因为不能保证调用 onSaveInstanceState(),你应该使用它只是为了记录活动的瞬时状态(UI 的状态)——你永远不应该用它来存储持久数据。相反,当用户离开活动时,您应该使用 onPause() 来存储持久数据(例如应该保存到数据库中的数据)。当当前活动重新显示给用户时,onRestart 也会在 onStop() 之后调用。因此,您可能可以将状态保存在 onPause / 如果 onRestart 被调用,它就像它被重新显示,而如果 onCreate 被调用而没有 onRestart 它被重新创建。

于 2013-01-25T10:36:41.407 回答