Android 安卓&x27;从睡眠中醒来后的活动生命周期

Android 安卓&x27;从睡眠中醒来后的活动生命周期,android,android-activity,lifecycle,Android,Android Activity,Lifecycle,如果某个活动显示在屏幕上,并且有一个带有单击侦听器的按钮,该按钮在onCreate方法期间连接到该按钮,然后设备进入睡眠模式(或者用户点击电源按钮关闭屏幕),当屏幕重新显示时,活动仍然可见,与进入睡眠模式之前一样 调用onResume,它作为活动生命周期的一部分进行记录。我不明白的是为什么onCreate没有再次被调用。在退出睡眠模式后,按钮的click listener如何才能正常工作?你可能会认为Android已经破坏了所有连接到活动的运行进程,其中包括按钮的单击侦听器。你的意思是什么,为什

如果某个活动显示在屏幕上,并且有一个带有单击侦听器的按钮,该按钮在onCreate方法期间连接到该按钮,然后设备进入睡眠模式(或者用户点击电源按钮关闭屏幕),当屏幕重新显示时,活动仍然可见,与进入睡眠模式之前一样


调用onResume,它作为活动生命周期的一部分进行记录。我不明白的是为什么onCreate没有再次被调用。在退出睡眠模式后,按钮的click listener如何才能正常工作?你可能会认为Android已经破坏了所有连接到活动的运行进程,其中包括按钮的单击侦听器。

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

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

当手机屏幕关闭时,会调用活动的
onPause()
回调,然后调用
onStop()
。然而,仅仅因为它到达
onStop()
并不意味着它总是到达
onDestroy()
。至少据我所知,Android操作系统试图尽可能多地使用内存,以便应用程序能够更快地加载,等等(这是一个真正的过度简化,但我相信这是一个普遍的想法)。这意味着当屏幕关闭时(至少在开始时),您的活动仍然存在于内存中。只有当系统确实需要活动所拥有的资源时,才会调用活动的
onDestroy()
。这就是为什么关闭屏幕时,按钮单击侦听器仍然有效。您的活动仍然存在于内存中,这意味着您的按钮侦听器也仍然被注册


我认为重要的是要指出,睡眠模式和关闭屏幕不是一回事。当您关闭屏幕时,它可能会或不会立即进入睡眠模式。当屏幕关闭但尚未进入睡眠模式时,cpu仍在工作,服务仍在运行。当手机进入睡眠模式时,它会关闭CPU的电源,基本上“冻结”所有进程,因此所有
服务也会关闭。使用wakelocks可防止手机进入睡眠模式,这就是为什么手机屏幕长时间关闭时,服务仍将运行的原因。如果你还没有读过它,它有一些非常好的信息。它还讨论了它的生命周期以及安卓如何优先考虑内存使用。

安卓的活动生命周期极其复杂,甚至在安卓上进行了多年的核心开发之后。你可以假设安卓操作系统会干扰你的活动生命周期,当它在后台时,它看起来是多么合适。这只代表了非常粗略的实际行为,主要是我通过经验、线索和错误得到的理解

在你的情况下,如果你在后台发送你的活动,如果android有可用的RAM,它会尝试将你的活动保存在RAM中,所以它会暂停和停止。现在,这种状态可以一直持续到您返回应用程序,然后它将通过onStart和onResume,因为您在创建时创建的所有引用/字段仍然存在,并且可以“重用”。另一方面,如果操作系统决定它需要更多内存,它可能会破坏您的活动,并将打开进行垃圾收集,还将经历onDestroy()生命周期。下次重新打开应用程序时,将创建一个新的“活动”,其状态保存在onSaveInstanceState()上,并且将运行onCreate()的整个生命周期


服务业也是一样。日常服务不应该运行太长时间,他们也应该在服务完成后立即停止服务。因此,如果操作系统在后台发现一个运行时间很长的服务,它会尝试在经过一段时间后将其删除,以节省电池/ram(这一决定可能还包括其他参数)。另一方面,如果你需要一个长期运行的服务,你需要手动保持一个唤醒锁,以提示操作系统“无论发生什么,我都需要这样做”。

当你按下电源按钮或主页按钮时,android操作系统会将你当前的活动放在后堆栈上, onCreate不会再次被调用的原因是,它专门用于创建视图和执行一次性内存操作,如将xml布局加载到“活动”中。系统的工作原理是,您不必每次进入该页面时分配内存,而只需在创建页面时分配内存。onResume会被调用,因为您将恢复到同一活动。 Memroy管理在Android中非常重要,因为它是一个移动操作系统。

简短回答: 创建
活动时调用
onCreate()

设备进入睡眠并返回的行为定义为
onPause()
onResume()
调用。设备睡眠不会杀死应用程序或活动状态保持(几乎)不变。

@AndroidDev如果您知道哪些方法在什么时候调用,您将清楚地知道这个问题。下面是在不同场景中名为list的方法

1) 当我们开始活动时,这次除了调用
startActivity(intent)
之外什么都没有

onCreate()
onStart()
onResume()
2) 睡眠模式下有多少种活动方式? a) 当我们按下锁定按钮时,它将进入睡眠模式,并在下面调用方法 b) 当我们按下overview按钮时,它将进入睡眠模式,下面是调用的方法 c) 当我们从当前活动开始另一个活动时,它将进入睡眠模式,并在下面调用

onPause()
onStop()
3) 活动破坏的方式有多少 a) 如果我们调用finish()方法,它将调用下面的方法 b) 如果我们点击后退按钮,它将调用下面的方法

onPause()
onStop()
onDestroy()
所以当任何活动进入睡眠模式时,它都不会呼叫<