为了使事情变得简单易行,我在Android Studio中创建了一个新的空项目,只有一个MainActivity和Hello World文本。这绝不是一个消费的应用程序。我还覆盖了所有重要的生命周期方法,如onCreate,onStart,onResume,onPause,onSaveInstanceState,onStop,onDestroy,并记录它们以查看发生的情况。
所以这就是我所经历的(在每一步中都打印了生命周期回调列表)
onCreate onStart onResume
onPause onSaveInstanceState onStop
onStart onResume
onCreate onStart onRestoreInstanceState onResume
我觉得这很奇怪,因为我的设备上的内存不低,而且基本上没有活动。我可以在清单中设置一些标志,还是在我返回时不会重新创建活动的任何解决方案?
请不要建议我使用onSaveInstanceState和onRestoreInstanceState保存和恢复状态,我特别感兴趣的是当我将应用程序移回前台时调用onCreate。我过去做了很多应用程序,我不记得在此之前将活动销毁这个问题。
答案 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并不打算让开发人员试图避免这种情况,只是在重新创建活动时从中断处继续。