Android睡眠后的活动生命周期

如果一个活动正在屏幕上显示,并且有一个点击监听器的button,在onCreate方法期间,该button被附加到button,然后设备进入睡眠模式(或者用户点击电源buttonclosures屏幕),当屏幕返回时,活动仍然可见,因为它是在进入睡眠模式之前。

onResume被调用,这被logging为活动生命周期的一部分。 我不明白的是为什么onCreate不会再被调用。 在睡眠模式退出后,button的点击监听程序如何工作? 你可能会认为Android已经销毁了所有正在运行的进程,这些进程连接到包含button的点击监听器的活动。

Solutions Collecting From Web of "Android睡眠后的活动生命周期"

你是什​​么意思,为什么不再调用onCreate()

简单的回答:当屏幕熄灭时,您的活动不会被破坏,因此没有理由再次调用onCreate()

当手机屏幕closures时,会调用activity的onPause()callbackonStop() ,然后是onStop() 。 但是,仅仅因为它到达onStop()并不意味着它会一直到达onDestroy() 。 至less据我的理解,Android的操作系统会尽可能地保留内存,这样应用程序的加载速度会更快,等等(这简直太过简单了,但我相信这是一般的想法)。 这意味着当屏幕closures时(至less在开始时),您的活动仍然存在于内存中。 只有当系统确实需要你的活动持有的资源时,才会调用你的活动的onDestroy() 。 这就是为什么当你closures屏幕时,你的button点击监听器仍然工作。 你的活动仍然存在于内存中,这意味着你的button监听器也是注册的。

我认为重要的是要指出,睡眠模式和closures屏幕不是一回事。 当您closures屏幕时,它可能会或可能不会立即进入睡眠模式。 当屏幕closures,但它还没有进入睡眠模式,CPU仍在工作,服务仍在运行。 当手机进入睡眠模式时,会closuresCPU,实质上是“冻结”所有进程,结果也是所有的services 。 使用唤醒锁可以防止手机进入睡眠模式,这就是为什么在手机屏幕长时间closures的情况下服务仍然可以运行。 如果您还没有阅读, Service参考有一些相当不错的信息。 它还讨论了其生命周期以及Android如何优先考虑其内存使用情况。

Android的活动生命周期极其复杂,甚至罗曼·盖伊(Romain Guy)表示,经过多年的Android核心开发之后, 他并不完全了解它 。 您可以假定Android操作系统可能会干扰您的“活动”生命周期,因为它在后台可能看起来合适。 活动生命周期只是非常粗略地表示实际行为,大部分是通过经验和追踪和错误得到了我的理解。

在你的情况下,如果你在后台发送你的活动,如果android有内存可用它试图保持你的活动在RAM中,所以它是通过onPause和onStop。 现在这个状态可以持久化,直到你返回到你的应用程序,那么它将通过onStart和onResume,因为你创build的onCreate的所有引用/字段依然存在,并且可以被“重用”。 另一方面,如果操作系统决定需要更多的内存,它可以破坏你的活动,并将打开垃圾收集,也将通过onDestroy()生命周期。 下一次你重新打开你的应用程序时,将会创build一个新的活动,保存状态为onSaveInstanceState(),onCreate()的整个生命周期将被运行

与服务是同样的事情。 通常服务不应该长时间运行,他们也应该立即停止自己。 所以如果操作系统发现一个在后台长时间运行的服务,它试图摆脱它,以节省电池/ ram经过不计其数的时间(也许其他参数包括在这个决定中)。 另一方面,如果你需要一个长时间运行的服务,你需要手动保持一个wakelock srinal操作系统“我需要这个不pipe做什么”。

当你按下电源button或主页button时,android操作系统把你当前的活动放回栈,原因为什么onCreate不会再被调用是,它是专门用来创build视图和执行一次内存操作,如加载您的XML布局到活动。系统的工作原理就像你每次进入页面时都不必分配内存,而只是在创build页面的时候分配内存.onResume被调用是因为你正在恢复到同一个活动。 Memroy Managment在Android中非常重要,因为它是一个移动操作系统。

简短的回答: onCreate()在创buildActivity时被调用。 设备进入睡眠状态并返回的行为被定义为onPause()onResume()调用。 设备睡眠不会杀死应用程序或活动状态保持(几乎)相同。