Android 在onSaveInstanceState()中设置标志以确定onDestroy()中的退出类型

Android 在onSaveInstanceState()中设置标志以确定onDestroy()中的退出类型,android,android-activity,Android,Android Activity,对于在线游戏,如果知道Android活动的onDestroy()是否仅因为Android将重新创建(例如设备旋转)而被调用,或者用户是否选择退出游戏,那就太好了 我的计划是在Android可能正在重新创建活动时,在活动的onSaveInstanceState()中设置一个标志: private boolean mDestroyedForReCreation; ... protected void onSaveInstanceState() { ... mDestroyedForR

对于在线游戏,如果知道Android
活动的onDestroy()是否仅因为Android将重新创建(例如设备旋转)而被调用,或者用户是否选择退出游戏,那就太好了

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

private boolean mDestroyedForReCreation;
...
protected void onSaveInstanceState() {
    ...
    mDestroyedForReCreation = true;
}
如果您这样做了,您可以在
onDestroy()
中检查
mdestroyedforreseation

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

这是正确的方法吗?如果是的话,是否建议这样做,或者是否有更好的解决方案?我希望如此,因为我真的不喜欢这个解决方案…

如果你需要知道这一点,你应该考虑自己处理旋转和其他配置改变的事件,而不是让系统去做。如果在清单中设置该活动处理configChanges,则它将在循环时调用onConfigChange,而不是销毁和重新创建该活动。大量的应用程序都能做到这一点,而安卓在轮换中破坏和重建游戏的行为完全是迟钝的。

我建议你将这种游戏逻辑从活动的生命周期中移除。创建一个服务。如果没有人绑定-所有活动都将停止。有人被捆绑住了-继续工作

如果不想创建服务,可以使用方法


您应该使用OnRetainOnConfiguration instance,因为当知道将立即为新配置创建新实例时,系统会调用它,作为由于配置更改而销毁活动的一部分。onSaveInstanceState在android要终止活动时调用,有时可能恢复,有时可能不恢复)。

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

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

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

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

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

onRestoreInstanceState()将被调用,如果它被还原/重新创建,如果活动被android杀死,它将保存其活动UI状态和一些可以覆盖的值onSaveInstanceState
但是,由于onSaveInstanceState()不能保证被调用,因此您应该只使用它来记录活动的瞬时状态(UI的状态)——永远不要使用它来存储持久数据。相反,当用户离开活动时,应该使用onPause()存储持久数据(例如应保存到数据库中的数据)。此外,当当前活动重新显示给用户时,onRestart将在onStop()之后调用。因此,您可能可以在onPause/中保存您的状态,如果调用onRestart,就好像它正在重新显示,而如果在没有onRestart的情况下调用onCreate,则会重新创建它。另一种解决方案是使用singleInstance和override方法onNewIntent,如果活动未被破坏,则调用该方法,但类似于根据新的意图重新启动。我只想简化整个过程,并设置一个在用户退出游戏时切换的标志,例如:

void exitGame() {
   mUserExited = true;
   finish();
}
(或者,如果需要销毁多个活动,则可能需要更多逻辑)

然后检查onDestroy()中的标志

关于配置更改(旋转等)的任何逻辑都与退出游戏标志无关


另外,请记住,“后退”按钮的默认行为是完成()当前活动(如果上面没有其他内容的话)——在本例中,这不算“退出”。这里的行为取决于您。

活动
有一个名为的方法,这可能就是您正在寻找的方法


请参阅:

谢谢!我真的不这么认为,实际上我喜欢安卓做配置更改。除了一些你真的需要自己处理这些更改的情况之外,这难道不是它真正想要的方式吗?我认为绝大多数非琐碎的应用程序都会覆盖配置更改。谷歌自己的大部分软件都有,包括他们的浏览器。谷歌地图API要求您这样做。请注意,即使覆盖它,仍会使其正确调整视图大小。我认为这让他们在Android开发的早期懒散地使用一些琐碎的应用程序,他们从来没有删除过这些应用程序,现在只能使用它们。或者是开发团队中的高层喜欢政治。我认为它唯一有帮助的是,如果你有横向文件夹,自动切换到横向资源。现在谁在没有提供替代方案的情况下否决了这个答案?我刚开始喜欢这个解决方案。但是我又在文档中找到了这一段:
注意:应该避免使用这个属性,并且只能作为最后的手段使用。
我有人四处走动,对我所有的帖子投了否决票。很明显,我惹恼了某人。根据国防部的说法,不是我原来想的那个人。谢谢!在我的
活动
的正常生命周期中,我肯定需要这段信息。但是为什么我更喜欢
onretainonconfigurationinstance()
(这是不推荐的)而不是`onSaveInstanceState()`(当Android杀死
活动而不是手动杀死它时,就会调用它)?谢谢,所以我可以用这样的方法
public Object onRetainNonConfigurationInstance(){mActivityRestarting=true;returnnull;}
我想您可以。试试看)别忘了取消mActivityRestar的设置