对此Android Activity生命周期场景感到困惑 - 只要应用程序返回前台

时间:2015-06-15 23:04:28

标签: android android-activity android-lifecycle

为了使事情变得简单易行,我在Android Studio中创建了一个新的空项目,只有一个MainActivity和Hello World文本。这绝不是一个消费的应用程序。我还覆盖了所有重要的生命周期方法,如onCreate,onStart,onResume,onPause,onSaveInstanceState,onStop,onDestroy,并记录它们以查看发生的情况。

所以这就是我所经历的(在每一步中都打印了生命周期回调列表)

  1. 应用/活动启动后(预期行为)
  2.   

    onCreate onStart onResume

    1. 按下主页按钮/应用后进入后台(预期行为)
    2.   

      onPause onSaveInstanceState onStop

      1. 我立即返回/ app进入前景(预期行为)
      2.   

        onStart onResume

        1. 在我按下主页按钮(应用程序进入后台)后,我打开另一个应用程序,如Facebook,并立即返回我的应用程序,我希望它恢复,但相反onCreate被调用。
        2.   

          onCreate onStart onRestoreInstanceState onResume

          我觉得这很奇怪,因为我的设备上的内存不低,而且基本上没有活动。我可以在清单中设置一些标志,还是在我返回时不会重新创建活动的任何解决方案?

          请不要建议我使用onSaveInstanceState和onRestoreInstanceState保存和恢复状态,我特别感兴趣的是当我将应用程序移回前台时调用onCreate。我过去做了很多应用程序,我不记得在此之前将活动销毁这个问题。

3 个答案:

答案 0 :(得分:3)

  

我打开像Facebook这样的另一个应用程序并立即返回我的应用程序,我希望它能够恢复,但转而使用onCreate

显然,Android终止了你的进程,无论是为了释放系统RAM,还是在某些其他应用程序(例如,任务管理器)的要求下。这可能也是特定于设备的,因为设备制造商可以从我所知道的内容中调整这些内容的工作原理。

  

我觉得这很奇怪,因为我的设备内存不低

也许Android或任务经理不同意你的看法。也许你确定空闲记忆的方法与记忆内杀手使用的方法不同。另外,请记住,Facebook使用的一些技术会导致他们为自己的进程使用大量的内存,因此与更精简的应用程序相比,它们会产生更多这类内容。

  

我可以在清单中设置一些标志,还是在我返回时不会重新创建活动的任何解决方案?

没有

话虽如此,内存杀手将使用多种因素来确定终止内存以释放内存的进程,包括:

  • 流程重要性(您是否在前台?您是否正在运行服务?)
  • 流程年龄
  • 处理工作集大小(即内存使用量)
  

请不要建议我使用onSaveInstanceState和onRestoreInstanceState保存和恢复状态

我建议所有Android开发人员使用onSaveInstanceState()onRestoreInstanceState()保存和恢复实例状态。这有助于配置更改以及这些类型的进程终止方案。

  

我过去做了很多应用程序,我不记得这个问题,因为这么早就被销毁了。

也许您没有在此设备上测试它们,或者在此设备和操作系统版本上测试它们(如果您进行了升级)。也许你没有在这种情况下测试它们(例如,启动Facebook)。也许您没有使用其他可能影响问题的应用程序测试它们。自从您编写了其他应用程序以来,可能您可以使用这些应用程序重新运行测试,以进行更多的同类比较。

答案 1 :(得分:2)

你可以(并且应该)通过打开“不要保持活动”来进行测试。开发者选项。你不能阻止它发生。这个可以总是发生,你必须优雅地处理它。

  

请不要建议我使用onSaveInstanceState和onRestoreInstanceState保存和恢复状态

如果您希望应用程序可靠地运行,那么您必须执行此操作。

答案 2 :(得分:1)

android生命周期保证了一些东西并且不保证其他东西。它保证如果您的活动被销毁,onCreate()将在onRartume()之前调用onStart()和onStart()。

但是,在大多数情况下,无法保证您的活动在进入后台后不会被销毁。原因尚未完全阐明,因为这为谷歌(以及个人的Android发行版)提供了将来修改此类内容的自由。没有这种保证的部分缺点意味着仅仅因为你的活动过去没有被破坏,并不意味着在不同版本的android,不同的设备或不同的环境中,它不会在现在被破坏

如果您必须知道确切的原因,我建议非常密切地监视日志输出,它可能包含一些线索。但请记住,android并不打算让开发人员试图避免这种情况,只是在重新创建活动时从中断处继续。