如果某个活动正在屏幕上显示并且有一个带有点击监听器的按钮,那么在onCreate方法期间它会附加到该按钮,然后设备进入睡眠模式(或者用户点击电源按钮关闭屏幕),当屏幕重新开启时,活动仍然可见,因为它是在进入睡眠模式之前。
onResume被调用,它被记录为活动生命周期的一部分。我不明白为什么onCreate不再被调用。在退出睡眠模式后,按钮的点击监听器甚至可以如何工作?您会认为Android已经破坏了附加到活动的所有正在运行的进程,其中包括按钮的单击侦听器。
答案 0 :(得分:2)
你的意思是什么,onCreate()
为什么不再被召唤?
简单回答:当屏幕熄灭时,您的活动不会被破坏,因此没有理由再次调用onCreate()
。
当手机屏幕关闭时,会调用活动的onPause()
回调,然后调用onStop()
。但是,仅仅因为它达到onStop()
并不意味着它总是会达到onDestroy()
。至少根据我的理解,Android的操作系统试图尽可能多地使用其内存,以便应用程序可以更快地加载备份等(这是一个真正的过度简化,但我相信这是一般的想法)。这意味着当屏幕熄灭时(至少在开始时),您的活动仍然存在于内存中。只有当系统确实需要您的活动所持有的资源时,它才会调用您的活动onDestroy()
。这就是为什么当你关闭屏幕时你的按钮点击监听器仍然有效。您的活动仍然存在于内存中,这意味着您的按钮侦听器仍然已注册。
我认为重要的是要指出睡眠模式和关闭屏幕不是一回事。当您关闭屏幕时,它可能会立即进入睡眠模式,也可能不会立即进入睡眠模式。当屏幕熄灭但它还没有进入睡眠模式时,cpu仍在工作,服务仍在运行。当手机进入睡眠模式时,它关闭CPU,基本上“冻结”所有进程,因此所有services
也是如此。使用唤醒锁可以防止手机进入睡眠模式,这就是为什么当手机屏幕长时间关闭时服务仍会运行的原因。如果您尚未阅读,Service
reference有一些相当不错的信息。它还讨论了它的生命周期以及Android如何优先考虑其内存使用情况。
答案 1 :(得分:1)
Android的活动生命周期非常复杂,甚至经过Android多年的核心开发Romain Guy states he doesn't understand it fully。您可以假设Android操作系统可能会干扰您的活动生命周期,使其在后台运行时看起来很合适。 activity lifecycle只是非常粗略地代表了实际行为,大部分是通过经验和追踪和错误得到了我的理解。
在你的情况下,如果你在后台发送你的活动,如果android有RAM可用,它会尝试将你的活动保存在RAM中,所以它会通过onPause和onStop。现在这个状态可以持续到你返回你的应用程序,然后它将通过onStart和onResume,因为你在onCreate上创建的所有引用/字段仍然存在并且可以“重用”。另一方面,如果操作系统决定它需要更多内存,它可以破坏你的活动,并且将打开垃圾收集,并且还将经历onDestroy()生命周期。下次重新打开应用程序时,将创建一个新活动,状态保存在onSaveInstanceState()中,onCreate()的整个生命周期将通过
运行通过服务,它是一回事。通常服务不应该长时间运行,他们也应该在完成后立即停止。因此,如果操作系统发现一个在后台运行很长时间的服务,它会试图摆脱它以节省电池/ ram(在此决定中可能包含其他参数)。另一方面,如果你需要一个长期运行的服务,你需要手动保持唤醒锁定操作系统“无论如何我都需要这样做。”
答案 2 :(得分:0)
当你按下电源按钮或主页按钮时,android OS会将你当前的活动放到后台, onCreate再次被调用的原因是,它专门用于创建视图和执行一次内存操作,例如将xml布局加载到activity中。系统工作,例如每次进入该页面时都不需要分配内存只有当你创建了page.onResume被调用,因为你正在恢复到同一个活动。 Memroy Managment在Android中非常重要,因为它是一个移动操作系统。
答案 3 :(得分:0)
简短回答:
创建onCreate()
时会调用Activity
。
设备进入休眠状态并返回的行为定义为onPause()
和onResume()
呼叫。设备休眠不会杀死应用程序或活动 - 状态保持(几乎)相同。
答案 4 :(得分:0)
@AndroidDev,如果您知道什么时候正在调用哪些方法,您将可以清楚地了解此问题。下面是在不同情况下称为list的方法
1)当我们开始活动时,这次只呼叫startActivity(intent)
onCreate()
onStart()
onResume()
2)活动进入睡眠模式有几种方式? a)当我们按下锁定按钮时,它将进入睡眠模式,并且下面的方法称为 b)当我们按下“概述”按钮时,它将进入睡眠模式,并且下面的方法称为 c)当我们从当前活动开始另一个活动时,它将进入睡眠模式,并在下面的方法中被称为
onPause()
onStop()
3)活动破坏了多少种方式 a)如果我们调用finish()方法,它将调用以下方法 b)如果单击“后退”按钮,它将调用以下方法
onPause()
onStop()
onDestroy()
因此,当任何活动进入睡眠模式时,都不会调用onDestory()
方法,这就是为什么当您从睡眠模式返回时,您的活动却没有调用onCreate
方法。
在您同时调用onCreate()
或破坏活动调用startActivity()
或同时按下这两个条件finish()
的后退按钮的情况下,destroy()
仅会首次调用。