Android 释放onStop()中的资源是否安全?

Android 释放onStop()中的资源是否安全?,android,activity-lifecycle,Android,Activity Lifecycle,大家好 我有一个活动,它在显示可见布局的同时分配了大量内存。UI严重依赖于此内存,但是,在用户离开活动(通常通过聚焦另一个活动)之后,无需保留这些分配 活动开始在onResume()中分配内存,一切正常。不过,让我有点困惑的是交易。现在,我释放了onPause()中的所有内存,这也会破坏相应的UI元素。由于活动在运行onPause()时仍然可见,因此用户将看到实际的UI元素被破坏。这很难看,不是我想要的 那么我的问题是: 在onStop()中释放内存(销毁UI)是否安全(根据文档,调用onSto

大家好

我有一个
活动
,它在显示可见布局的同时分配了大量内存。UI严重依赖于此内存,但是,在用户离开
活动
(通常通过聚焦另一个
活动
)之后,无需保留这些分配

活动开始在
onResume()
中分配内存,一切正常。不过,让我有点困惑的是交易。现在,我释放了
onPause()
中的所有内存,这也会破坏相应的UI元素。由于
活动
在运行
onPause()
时仍然可见,因此用户将看到实际的UI元素被破坏。这很难看,不是我想要的

那么我的问题是:

  • onStop()
    中释放内存(销毁UI)是否安全(根据文档,调用
    onStop()
    时,
    活动不可见)
  • onStop()
    可靠吗
  • 每次调用
    onPause()
    时是否保证调用
    onStop()

  • 编辑:
    我觉得我必须解释清楚是什么让我困惑。根据:

    …对于那些被标记为可杀死的方法,在那之后 方法返回托管活动的进程可能被 系统在任何时候都不会执行另一行代码

    onStop()
    方法被标记为“killable”

    • 上述内容是否意味着(特别是该方法返回后的“
      ”部分),
      onStop()
      的整个范围保证运行,但一旦返回,任何运行时都不保证任何其他内容(例如,在
      onStop()
      中启动的派生线程)

    • 或者这是否意味着
      onStop()
      甚至在到达其作用域的末尾之前就可能被中断(从
      在任何时候被杀死的部分开始)

    • 或者它是不是意味着我——在我神圣的愚蠢中——看不到的其他东西

    onStop()
    应该是安全可靠的,完全符合您的目的

    在这种情况下,“保证”是相对的,因为您的活动可能会在没有任何通知的情况下被终止。但在这种情况下,您的内存资源将被释放

  • 它和其他东西一样安全吗?更糟的是,你的应用程序将被onDestroy杀死。在移动开发中,您基本上必须假设在任何给定的时刻您的应用程序都可能被杀死
  • 这对我来说是可靠的,我发布媒体对象已经有一段时间了
  • 不一定,因为有时根据发生的情况调用onDestroy

  • 不,这不安全,因为保证只调用onPause()。onPause()表示您的活动失去焦点—这是一个提供不必要资源的完美场所

    不同之处在于,活动确保在“销毁”视图之前,
    onPause
    应首先完成执行,而
    onStop
    是一个生命周期阶段,在视图已经在后台之后,这意味着活动不再可见

    onPause
    中执行操作可确保需要保存的项目在释放它们之前仍然完好无损-例如,您需要将文本保存在编辑文本中,或单选按钮的开/关位置,等等


    然而,解除分配不再需要这些东西,所以如果你在你的
    桌面上做这件事应该没问题,只是好奇,你需要解除分配什么样的分配,为什么不能依赖正常的GC操作呢?实际上有很多不同的资源;从数据库读取的结果、重动画使用的资产、内存缓存等。我不想将这些东西保留在内存中的原因是,我有一些活动的行为都是这样的。我担心它们会消耗大量的运行时内存(可能是全部的?),因此我希望通过强制执行来确保与聚焦活动无关的所有内容都被回收。我的问题是在活动状态机中找到一个适当且可靠的阶段,在该阶段可以强制执行回收。如果仔细查看活动生命周期图(developer.android.com),onStop方法是onDestroy和onRestart之间的“中间”状态。你的活动不能只是从onPause“跳”到onDestroy。我的问题不是系统关闭我的应用程序的情况。这更多的是需要微调的默认行为:我希望在用户看不到资源被释放的情况下释放资源(因为我的资源与UI紧密绑定,释放资源会反映在UI元素被移除的情况下)。如果你的应用程序没有对onStop做出正确响应,或者没有足够快地释放系统所需的资源,onDestroy可以随时调用。但是,是的-首先调用onStop。不幸的是,您可能在语句的本质上是正确的:-)onPause()是否完美地将资源返回给系统是有争议的;当
    onPause()
    运行时,活动仍然可见,因此,在我的例子中,回收资源反映在UI元素过早消失(用户可以看到它们消失)中,这就是我希望通过在活动已经隐藏其UI的状态下回收来规避的问题。官方神圣抄写员不同意你的观点:onPause()当另一个活动已经在前面并且您失去了焦点时调用。当屏幕锁定开始发挥作用时,还有一些额外的奇怪之处-您的arcivity被迫进入portait模式(即使它已取消横向),因此暂停-启动-暂停;)。你必须小心,事实上,我想说,官方的神圣抄写员完全同意我的观点:在onPause()期间,活动是可见的。onPause()甚至会阻止任何其他活动