【问题标题】:Overview of how Activities are killed by the system系统如何杀死活动的概述
【发布时间】:2010-11-28 12:49:13
【问题描述】:

谁能简要概述一下活动何时以及如何被运行时杀死的情况?我想知道暂停和停止状态之间的区别。什么可以迫使系统破坏暂停的活动,与停止活动的原因完全相同(内存不足)?

我认为,如果活动因来电(突然导致内存不足的情况)而暂停,系统只会更喜欢释放已停止活动的资源。但是这是怎么做到的呢?系统何时通过调用finish()“亲切地询问”活动,何时不调用,何时仍然调用onDestroy()?

【问题讨论】:

  • developer.android.com 的“应用程序基础”部分对 Activity 生命周期进行了详细描述,应该可以回答您的大部分问题。
  • 不,它没有回答上述问题。如果您对此有疑问,请查看。
  • @cody:如果您真的花一些时间阅读 Josef 链接的文档,您应该对 Android 应用程序生命周期的工作原理有必要的了解,这应该回答你的问题。如果还有一些不清楚的地方,我建议就这个问题提出一个具体的问题。
  • 好吧,如果你有把握,为什么不直接把答案放在这里呢?我问了一个具体问题,如果您再次阅读我的帖子,您可能会得到这个问题。当然,我已经看过指南(不止一次),也许我应该明确提到这一点。此外,我注意到这里的一些海报并不是真的想帮忙,他们只是想获得声誉。对不起,但是知道答案的人需要很多话吗?可能不超过一个句子,或者你怎么看?
  • 我添加了一个空行。换句话说,指出这个问题:我想知道活动从活动堆栈中完全删除的确切原因,以及是否调用了 onDestroy。

标签: android runtime kill activity-lifecycle


【解决方案1】:

文档对您提出的大部分问题进行了很好的描述,但我想我可以澄清一些事情。

我想知道区别 在暂停和停止状态之间。

可见性。这两种状态是不同的,因为暂停的活动可能仅被另一活动部分遮盖,例如应用了Dialog 主题的活动。这需要保留维持视觉状态所需的任何资源。停止的活动可以抛弃那些资源,如果资源紧张,这些资源可能会导致活动被破坏或保留。

我认为......系统只是更喜欢 释放停止的资源 活动。但是这是怎么做到的呢?

它必须。停止的活动是完全不可见的,这使得它们比那些仍在为用户看到的内容做出贡献的活动更适合杀死。我从未见过 Android 从已恢复的活动中拉出暂停但部分可见的活动,但我认为它可能在适当的情况下发生。系统知道每个活动的状态,因为这是将它们引导到那里的原因。

系统什么时候“请教” 通过调用完成()和何时进行活动 不是,什么时候 onDestroy() 仍然 被叫了?

系统会在可能的情况下进行有序销毁,但 API 唯一的保证是 Activity 将永远看到 onPause()onSaveInstanceState()

ETA:从堆栈中删除活动的确切原因在于源代码。您不应该将这些原因视为普遍真理,因为未来的 Android 版本可能会做出不同的决定。

【讨论】:

  • 谢谢,这有助于澄清它。所以在一些罕见的情况下 onDestroy() 甚至 onStop() 都没有被调用。
【解决方案2】:

课程标准杆,我明白了!我看到一些有价值的信息,混杂着昂贵的错误信息。不,在线文档并没有具体说明在什么情况下进程被终止。这是故意的,因为它可能会在没有通知的情况下更改。当然,调用 onDestroy() 的最常见原因是系统内存不足,这在较新的手机上不太常见(因为它们有这么多内存)。但不能保证这是调用它的唯一原因。

但是,是的,Android 和开发者之间的“契约”是,如果您遵守规则,在需要时实现所需的生命周期回调,那么它将起作用,您无需确切知道在什么情况下 onStop ()、onSaveInstanceState() 和 onDestroy() 被调用。

现在与谷歌不同的是,我承认合同的措辞有些含糊。这是因为,除其他次要原因外,他们使用具有标准行业含义的术语,例如“前景”,但他们使用它们的含义略有不同。而这种改变要么从未被解释过,要么只在晦涩难懂的地方得到解释。该图声称显示“活动在状态之间可能采用的路径”也无济于事,但未能显示 onDestroy() 可以多次调用,甚至绕过从 Resumed 到 Stopped 的转换。然而,文本清楚地描述了这种可能性。

不幸的是,这就是为什么仅仅阅读“应用程序基础”的应用程序生命周期部分是不够的。相反,您还必须阅读 Activity 下的每个回调的 Javadoc,以及有关进程的“应用程序基础”部分。

之后,将 Log.d 语句放入每个回调中并在您循环应用程序的整个生命周期时观察 logcat 输出非常有帮助。但即便如此,也不要依赖于按照您在 logcat 中看到的顺序发生的生命周期事件,除非您可以在上面提到的这些在线文档之一中找到理由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多