0

任何人都可以简要概述运行时何时以及如何杀死活动的情况吗?我想知道暂停和停止状态之间的区别。什么可以迫使系统破坏暂停的活动,就像它被停止一样(低内存)原因?

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

4

2 回答 2

4

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

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

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

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

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

于 2011-06-05T22:22:08.910 回答
4

文档中很好地描述了您所问的大部分内容,但我想我可以澄清一些事情。

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

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

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

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

系统什么时候通过调用finish()“亲切地询问”活动,什么时候不,什么时候仍然调用onDestroy()?

系统会在可能的情况下进行有序销毁,但 API 仅保证活动将永远看到onPause()onSaveInstanceState().

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

于 2010-11-28T16:28:36.013 回答