从 sleep 中醒来后的 Android Activity 生命周期

标签 android android-activity lifecycle

如果一个 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/

相关文章:

android - 启动 Activity 和启动应用程序是否相同?

android - 添加带有滚动内容的固定标签栏?

amazon-web-services - 生命周期 Hook 失败并出现错误 137

android - 适用于 Android 和 iOS 的离线 map SDK

android - 我的启动器应用程序没有自动更新

android - 如何在选项卡的 Activity 中使用 setCurrentTab 方法?

android - 接收器生命周期 - 在 onResume() 中重新注册时崩溃

android - 是/否对话框和生命周期

android - ionic 平台配置错误: ubuntu

c# - 为 Android 开发时,如何在 Unity 中动态更改网格布局组组件的单元格大小?