任何人都可以简要概述一下活动何时以及如何被运行时杀死的情况?我想知道暂停状态和停止状态之间的区别。什么可以迫使系统破坏暂停的活动,完全相同(低内存)的原因就好像停止了一样?
我认为如果由于来电(突然导致内存不足导致)暂停活动,系统会更喜欢释放已停止活动的资源。但那怎么办?系统什么时候通过调用finish()来“请求”活动,什么时候不调用onDestroy()什么时候被调用?
答案 0 :(得分:4)
你提出的大部分内容都是通过文档很好地描述的,但我想我可以澄清一些事情。
我想知道其中的区别 在暂停和停止状态之间。
可见性。这两个州是截然不同的,因为暂停的活动可能只会被另一个活动(例如应用了Dialog
主题的活动)部分遮挡。这需要保留维持视觉状态所需的任何资源。如果资源紧张,停止的活动可能会抛弃那些可能导致活动被破坏或保留的资源。
我认为......系统更喜欢 释放已停止的资源 活动。但那是怎么做到的?
必须。停止的活动是完全不可见的,这使得它们比那些仍然为用户看到的东西做出贡献的人更适合杀人。我从来没有见过Android从一个已经恢复但尚未完成的活动中抽出一个暂停但部分可见的活动,但我想这可能会在适当的情况下发生。系统知道每个活动的状态,因为它是指导他们的状态。
系统什么时候“请问” 调用finish()和when时的活动 不,onDestroy()什么时候仍然 被叫?
系统会尽可能地进行有序破坏,但API仅保证活动会看到onPause()
和onSaveInstanceState()
。
ETA:从堆栈中删除活动的确切原因在源代码中。你不应该依赖这些普遍真理的原因,因为Android的未来版本可能会以不同的方式做出决定。
答案 1 :(得分:4)
参加课程,我明白了!我看到一些有价值的信息,加上昂贵的错误信息。不,在线文档并不是每个人都准确指出在什么情况下该过程被杀死。这是故意的,因为如有变更,恕不另行通知。当然,调用onDestroy()的最常见原因是系统内存不足,这在较新的手机上不常见(因为它们有如此多的内存)。但不能保证这只是它的唯一理由。
但是,是的,Android和开发人员之间的“契约”是,如果您遵循规则,在需要时实施所需的生命周期回调,那么它将起作用,您无需确切知道在什么情况下onStop调用(),onSaveInstanceState()和onDestroy()。
现在与谷歌不同,我承认合同的措辞在某些方面有些模糊。这是因为,除了其他较小的原因,他们使用具有标准行业意义的术语,例如“前景”,但他们使用略有改变的意义。并且只有在不起眼的地方才能解释或解释改变。图表声称显示“活动可能在状态之间进行的路径”也没有帮助,但未能显示onDestroy()可以多次调用,甚至绕过从Resumed到Stopped的转换。然而,文本清楚地描述了这种可能性。
这就是为什么,遗憾的是,阅读“应用程序基础”的应用程序生命周期部分是不够的。相反,还必须为Activity下的每个回调读取Javadoc,以及进程上的“Application Fundamentals”部分。
之后,在每个回调中放置Log.d语句并在循环应用程序整个生命周期时观察logcat输出是非常有帮助的。但即便如此,也不要依赖于您在logcat中看到的生命周期事件,除非您可以在上述其中一个在线文档中找到理由。