活动无法恢复

时间:2013-08-07 18:56:29

标签: java android xml

在过去的几个月里,我一直在开发一个多功能的实时游戏引擎,我已经学到了很多,但在应用程序生命周期方面我仍然觉得很天真。具体来说,我正在尝试实现一个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的人来说仍然有用。

1 个答案:

答案 0 :(得分:5)

本文中列出了多种可能的问题/解决方案。这包括对活动生命周期 launchMode设置的误解。

  

首先,如何通过启动器图标恢复我的活动   重新启动游戏?

您很可能缺少 onResume() onPause()方法的定义。例子如下:

http://developer.android.com/training/basics/activity-lifecycle/pausing.html

直接来自API:

  

onPause()作为活动生命周期的一部分时调用   活动进入后台,但尚未被杀死。

     

onResume()在onRestoreInstanceState(Bundle)之后调用,   onRestart()或onPause(),用于开始与之交互的活动   用户。

When coding an Android application, you have to understand and follow this flow:

检查 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)