【问题标题】:How can we guarantee that onPause will be called?我们如何保证 onPause 会被调用?
【发布时间】:2014-09-01 07:39:41
【问题描述】:

这个问题 android save game state in onPause or onDestroy?

答案强调提出问题的人应该在 onPause 中保存游戏状态,因为 onDestroy 文档说“在某些情况下,系统会简单地终止活动的托管进程而不调用此方法(或任何其他方法),因此它不应该被用来做那些打算在流程消失后仍然存在的事情。”在这些情况下,我们如何确保 onPause 会被调用?是否可以控制在这些情况下调用哪些方法?似乎无法预测

【问题讨论】:

标签: android onpause ondestroy


【解决方案1】:

onPause 将在您的活动每次离开屏幕时、在它完成之前或如果有东西覆盖您的活动以阻止用户与您的活动进行交互时调用。

您不必担心不会调用 onPause。

有关更多信息,请查看 starting and stopping activity trainingLifecycle Api Docs

【讨论】:

    【解决方案2】:

    您应该将临时实例状态保存在 onSaveInstanceState() 中。此方法接收一个Bundle 参数,您可以使用它来写入状态。然后,当您的应用重新启动时,Bundle 将发送到 onCreate()

    如果您需要更永久地保存实例状态,请将其保存到数据库或 SharedPreferences。根据http://developer.android.com/training/basics/activity-lifecycle/stopping.html,您应该使用onStop() 进行更多CPU 密集型操作,而不是onPause()。我认为您不必担心在正常用例中会调用onPause()。据我所知,这是有保证的。 (当然,灾难性的故障总是存在的,比如用户拔出设备的电池,但你无能为力。)

    【讨论】:

      【解决方案3】:

      几乎可以肯定onPause() 总是会被调用。原因是“系统”极不可能主动杀死活跃的(即可见的)Activity

      为了释放资源,Android 操作系统有效保留终止休眠进程的权利,尤其是那些长期运行但最近未使用的进程。为了使您的Activity(及其进程)符合此条件,在某些时候您必须将Activity 发送到后台状态,例如,按下HOME 或启动另一个应用程序的Activity。您的Activity 不再可见的简单事实意味着它将被暂停并且onPause() 将被调用。几乎可以肯定,Activity 将被停止,onStop() 也将被调用。

      您必须记住的是,Android 已经存在了一段时间,早期设备的 RAM 以 100 MB 为单位,系统行为可能性和文档反映了这一点。最新设备的 RAM 以 GB 为单位(甚至是 10 GB),因此除非用户真的将他们的设备推到其资源的限制范围内,否则不太可能主动清理应用程序进程。

      【讨论】:

        【解决方案4】:

        您可以显示对话框让用户相应地进行操作。当打开对话框询问用户是否要退出时,Activity 肯定会调用 onPause(),此时您可以编写游戏状态保存代码。最好在 onPause() 上编写代码,因为 onDestroy() 上的资源由操作系统释放。

        【讨论】:

          猜你喜欢
          • 2013-01-30
          • 1970-01-01
          • 2014-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多