在过去的几个月里,我一直在开发一个多功能的实时游戏引擎,我已经学到了很多,但在应用程序生命周期方面我仍然觉得很天真.具体来说,我正在尝试实现一个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();
}
Run Code Online (Sandbox Code Playgroud)
这些神秘的pause()和resume()方法只是简单地设置一个布尔变量来阻止某些游戏逻辑被执行,它们不会阻碍工作线程,这应该继续循环.
编辑:谢谢穆罕默德解决我的第一个(虽然更小)的问题.事实证明,当未通过USB连接到IDE时,启动器图标的行为会有所不同.第二个问题仍未得到解决.
编辑:一切正常!第二个问题是我的代码特有的问题,我为此道歉.我希望这个问题对那些处理启动器和IDE的人来说仍然有用.
首先,如何通过启动器图标恢复活动,而不是重新启动游戏?
您很可能缺少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()中加载状态.为了保存状态,您可以查看:
对于那些使用Eclipse(或任何其他IDE来运行/测试您的应用程序)的人:
根据你所描述的内容,你可能已经在AndroidManifest.xml中覆盖了 android:launchMode,或者如果你通过Eclipse中的"run as"进行测试,请在安装和自动启动后退出应用程序.然后从模拟器重新开始并测试Home按钮的行为.我想这是因为Android从Eclipse启动时没有将Activity放在OS堆栈上,然后Home按钮行为不像往常一样.如果这不能解决您的问题,请尝试阅读 http://developer.android.com/guide/topics/fundamentals.html#lmodes.
我在StartupActivity中设置了launchMode.我删除了它(它被设置为"singleTask",它的行为就像我想要的那样;应用程序"恢复"到我期望的活动,即不是StartupActivity而是MainActivity.
资源:
http://developer.android.com/guide/topics/manifest/activity-element.html
根据这个:
您应该将您的andoird:launchMode更改为" Standard "(或" default ").
Standard: A > B > HOME > B (what you want)
SingleTask: A > B > HOME > A (what you don't want)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |