【问题标题】:onCreate() and onDestroy() NOT symmetric?onCreate() 和 onDestroy() 不是对称的?
【发布时间】:2018-10-30 16:11:41
【问题描述】:

我正在学习 android,并提出了一个我认为很奇怪的观察结果:

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

似乎当应用程序失去焦点或被置于后台时,系统可以在不调用 onDestroy 的情况下终止应用程序。稍后,当应用程序再次启动时,会调用 onCreate。

我尝试对此进行测试,但无法弄清楚如何模拟系统因内存问题而终止应用程序的情况。我试图在我的手机上打开很多应用程序,测试应用程序从未被杀死:)

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

谢谢。

【问题讨论】:

    标签: android memory-leaks resources oncreate ondestroy


    【解决方案1】:

    documentation can really explain this better

    不过,简而言之,如果 Activityfinish() 结尾或 Android 需要您的应用正在使用的资源,则将调用 onDestroy()

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

    我将使用onPause() 确保资源及时用完。您只需要对已注册的资源(如BroadcastReceiver)执行此操作。停止重复 Handler 消息。诸如此类。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我尝试对此进行测试,但无法弄清楚如何模拟系统因内存问题而终止应用程序的情况。

        只要使用设置->开发者选项->不要一直保持活动模式来获取onDestroy。还可以在同一菜单中使用后台进程限制。

        onDestroy 的松散调用是极端情况。每次活动销毁时系统调用 onDestroy,即使在内存不足的情况下也是如此。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

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