在过去的几个月里,我一直在开发一个多功能的实时游戏引擎,我已经学到了很多,但在应用程序生命周期方面我仍然觉得很天真。具体来说,我正在尝试实现一个Activity,它可以被用户拖入后台,然后正常恢复。
我目前的架构是这样的:我有一个XML菜单启动器活动,可以使用intent创建实时游戏活动。此游戏活动中的相关数据通过静态数据结构和变量引用。 Game活动在我的SurfaceView对象的onSurfaceCreate()回调中创建工作线程。
当用户按下后退按钮时,活动将被销毁,并将它们发送回启动器活动中的XML菜单。很好,现在很好。当用户按下主页按钮时,活动将被发送到后台。太好了。当用户尝试在游戏活动中找回回路后,我的问题就出现了。当用户触摸启动器图标时,游戏将被销毁并重新启动菜单。此外,当用户通过任务管理器恢复游戏时,onSurfaceCreate()回调将触发并启动工作线程,但游戏将被冻结。
所以,我有两个问题。首先,如何通过启动器图标恢复活动,而不是重新启动游戏?其次,当我恢复活动时,在保持游戏数据的同时重启我的工作线程需要采取什么行动?
谢谢!
编辑:根据要求,我在下面提供了一些代码。我的onSurfaceCreate有点复杂,它向另一个线程发送消息,然后另一个线程实现回调。我已经确认在恢复游戏活动时会激活此实现功能。
protected void surfaceCreate()
{
Log.e(TAG, "surfaceCreate");
Thread gameThread = createGameThread();
gameThread.start();
}
protected final void onResume()
{
super.onResume();
resume();
}
protected final void onPause()
{
super.onPause();
pause();
}
这些神秘的pause()和resume()方法只是简单地设置一个布尔变量来阻止某些游戏逻辑被执行,它们不会阻碍工作线程,这应该继续循环。
编辑:感谢穆罕默德解决我的第一个问题(虽然规模较小)。事实证明,当未通过USB连接到IDE时,启动器图标的行为会有所不同。第二个问题仍未解决。 编辑:一切正常!第二个问题是我的代码特有的问题,我为此道歉。我希望这个问题对那些处理启动器和IDE的人来说仍然有用。答案 0 :(得分:5)
首先,如何通过启动器图标恢复我的活动 重新启动游戏?
您很可能缺少 onResume()和 onPause()方法的定义。例子如下:
http://developer.android.com/training/basics/activity-lifecycle/pausing.html
直接来自API:
onPause()作为活动生命周期的一部分时调用 活动进入后台,但尚未被杀死。
onResume()在onRestoreInstanceState(Bundle)之后调用, onRestart()或onPause(),用于开始与之交互的活动 用户。
检查 Android活动生命周期:
http://developer.android.com/reference/android/app/Activity.html
关于你的问题的一个理论可能是你最有可能去onStop()(通过点击主页按钮)并且Android OS正在寻找你的onRestart(),但是找不到它因此冻结/重新启动。
其次,当我恢复活动时,需要采取什么行动 重新启动我的工作线程,同时保留游戏数据?
小心如何使用重启这个词。您想要暂停和恢复应用程序(而不是重新启动)。将数据保存在onPause()中(使用数据库或您喜欢的任何其他保存功能)。在onResume()中加载数据。虽然,如果您只是填写这些方法,活动应该恢复正常。
现在,如果要在重新启动应用程序时保存状态,则应该在onStop()和/或onDestroy()中保存状态。您应该在onStart()中加载状态。为了保存状态,您可以查看:
https://stackoverflow.com/a/151940/2498729
对于那些使用Eclipse(或任何其他IDE来运行/测试您的应用程序)的人:
根据你描述的内容,你可能已经被覆盖了 AndroidManifest.xml 中的 android:launchMode ,或者如果您正在测试 Eclipse中的“run as”尝试在安装后退出应用程序 自动启动。然后从模拟器重新开始并测试Home 按钮行为。我想这是因为Android没有放 从Eclipse和Home启动时,OS堆栈上的活动 按钮行为不像往常一样。如果这不能解决您的问题, 试试看 http://developer.android.com/guide/topics/fundamentals.html#lmodes。
我在StartupActivity中设置了launchMode。我删除了它(它 被设置为“singleTask”,它表现得像我想要的那样;该应用程序是 “恢复”到我期望的活动,即不是StartupActivity MainActivity。 强>
来源:
https://stackoverflow.com/a/1619461/2498729
http://developer.android.com/guide/topics/manifest/activity-element.html
根据这个:
https://stackoverflow.com/a/3002890/2498729
您应该将您的andoird:launchMode更改为“标准”(或“默认”)。
Standard: A > B > HOME > B (what you want)
SingleTask: A > B > HOME > A (what you don't want)