如果一个 Activity 正在屏幕上显示,并且有一个带有点击监听器的按钮,它会在 onCreate 方法期间附加到按钮,然后设备进入休眠模式(或者用户点击电源按钮关闭屏幕),当屏幕恢复时, Activity 仍然可见,就像进入休眠模式之前一样。
onResume 被调用,这被记录为 Activity 生命周期的一部分。我不明白的是为什么 onCreate 没有被再次调用。按钮的点击监听器在退出 sleep 模式后怎么可能正常工作?您会认为 Android 已经销毁了附加到 Activity 的所有正在运行的进程,其中包括按钮的点击监听器。
最佳答案
你的意思是,为什么 onCreate()
不再被调用?
简单的回答:当屏幕关闭时,您的 Activity 并未被销毁,因此没有理由再次调用 onCreate()
。
当手机屏幕关闭时,将调用 Activity 的 onPause()
回调,然后调用 onStop()
。但是,仅仅因为它到达了 onStop()
并不意味着它总是会到达 onDestroy()
。至少根据我的理解,Android 的操作系统试图尽可能多地使用其内存,以便应用程序可以更快地加载备份,等等(这是一个真正的过度简化,但我相信这是一般的想法)。这意味着当屏幕关闭时(至少在开始时),您的 Activity 仍然存在于内存中。只有当系统确实需要您的 Activity 持有的资源时,它才会调用您的 Activity 的 onDestroy()
。这就是为什么当您关闭屏幕时您的按钮点击监听器仍然有效的原因。您的 Activity 仍然存在于内存中,这意味着您的按钮监听器也仍然已注册。
我认为重要的是要指出 sleep 模式和关闭屏幕不是一回事。当您关闭屏幕时,它可能会或可能不会立即进入休眠模式。当屏幕熄灭但尚未进入休眠模式时,cpu 仍在工作并且服务仍在运行。当手机进入休眠模式时,它会关闭 CPU,实质上“卡住”所有进程,因此所有 服务
也会“卡住”。使用唤醒锁可以防止手机进入休眠模式,这就是为什么在手机屏幕关闭一段时间后服务仍会运行的原因。如果您还没有阅读,Service
reference有一些很好的信息。它还讨论了它的生命周期以及 Android 如何确定其内存使用的优先级。
关于从 sleep 中醒来后的 Android Activity 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500376/