onCreate()和onDestroy()不对称吗?

时间:2018-10-30 16:11:41

标签: android memory-leaks resources oncreate ondestroy

我正在学习android,并提出了我认为很奇怪的看法:

基于https://developer.android.com/guide/components/activities/activity-lifecycle上的图表和说明 似乎两个回调onCreate和onDestroy是不对称的。

似乎当应用失去焦点或被置于后台时,系统可能会在不调用onDestroy的情况下杀死该应用。稍后,当应用再次启动时,将调用onCreate。

我试图对此进行测试,但无法弄清楚当内存不足导致系统终止应用程序时如何模拟这种情况。我试图在手机上打开很多应用程序,但测试应用程序从未被杀死:)

让我们说它确实发生在某些情况下。这是否意味着您可以调用onCreate而不是onDestroy,如果您碰巧在onCreate中获取资源并释放onDestroy,则可能导致内存泄漏?如果我的观察是正确的,那么有什么最佳实践可以解决资源释放问题?

谢谢。

4 个答案:

答案 0 :(得分:1)

documentation can really explain this better

但是,简而言之,如果onDestroy()Activity结尾或Android需要应用正在使用的资源,则会调用finish()

我通常不会使用onDestroy()来管理资源。实际上,我认为我从未在自己编写的任何应用中使用过onDestroy()

我将使用onPause()以确保资源及时使用。您实际上只需要对已注册的资源(例如BroadcastReceiver)执行此操作。停止重复Handler条消息。这样的事情。

答案 1 :(得分:0)

我不确定,但我认为有一种方法可以使用adb命令模拟系统终止应用程序

https://possiblemobile.com/2017/10/android-testing-app-killed-background/

答案 2 :(得分:0)

  

我试图对此进行测试,但无法弄清楚当内存不足时系统将终止该应用程序的情况。

只需使用“设置”->“开发人员选项”->“不要保持活动模式”始终打开即可。还要在同一菜单上使用“后台进程限制”。

onDestroy的错误调用是极端情况。每当活动销毁时,即使内存不足,系统也会调用onDestroy。

答案 3 :(得分:0)

谢谢大家。使用@Igor的技巧,我能够测试并证明@Knossos提到的几点:一旦应用失去焦点,就会调用OnDestroy。据我所知,这意味着onCreate和onDestroy仍然是对称的。这也意味着android文档站点(https://developer.android.com/guide/components/activities/activity-lifecycle)上的图需要进行一些改进。

再次感谢大家的投入。关于资源管理的最佳实践,现在我要考虑的更多,因此值得进行大量深入的讨论,因为许多因素可能导致复杂性:资源的类型,获取和释放它们的系统开销等等