从睡眠状态恢复后,Android的活动生命周期

10
如果屏幕上显示一个带有点击监听器的按钮并正在执行某项活动,则在onCreate方法期间将其附加到该按钮,然后设备进入睡眠模式(或用户轻敲电源按钮关闭屏幕),当屏幕重新开启后,活动仍然可见,就像进入睡眠模式之前一样。
onResume将被调用,这是文档化作为活动生命周期的一部分。我不明白的是为什么不再次调用onCreate。设想Android已经销毁了所有与活动相关的运行进程,包括按钮的单击监听器,那么即使从睡眠模式中恢复,按钮的单击监听器也如何工作呢?

最终你想要什么! - Dixit Patel
1
当然,这正是我想要的,但我的问题是发生了什么。如果处理程序和线程没有被销毁,我只能假设Android(或硬件)能够“暂停”所有进程的状态(除了像AlarmManager这样的进程),然后在设备退出睡眠模式时“恢复”此状态。我认为这只有通过设备的架构才可能实现以节省电池电量。真正有趣的是,如果这是真的,为什么后台服务在从睡眠模式中恢复时不保持活动状态。它们可以并且确实会在睡眠模式中被杀死。 - Johann
5个回答

3
什么意思,为什么onCreate()不再被调用?
简单的答案是:当屏幕关闭时,您的活动并没有被销毁,因此没有理由再次调用onCreate()
当手机屏幕关闭时,将调用活动的onPause()回调,随后是onStop()。然而,仅仅因为它到达了onStop()并不意味着它总是会到达onDestroy()。就我所知,Android操作系统会尽可能地保留其使用的内存,以便应用程序能够更快地加载等(这是一个非常简化的解释,但我相信这是一般想法)。这意味着当屏幕关闭时,您的活动仍然存在于内存中(至少在开始时是这样)。只有当系统真正需要您的活动持有的资源时,才会调用您的活动的onDestroy()。这就是为什么在您关闭屏幕时,按钮点击监听器仍然起作用的原因。您的活动仍然存在于内存中,这意味着您的按钮监听器也仍然注册。
我认为有必要指出,休眠模式和关闭屏幕并不是同一件事情。当您关闭屏幕时,它可能立即进入休眠模式,也可能不会。当屏幕关闭但尚未进入休眠模式时,CPU仍在工作,服务仍在运行。当手机进入休眠模式时,它会关闭CPU,从而“冻结”所有进程,结果所有服务也会被关闭。使用唤醒锁可以防止手机进入休眠模式,这就是为什么在手机屏幕关闭一段时间后,服务仍将继续运行的原因。如果您还没有阅读它,服务参考中有一些非常好的信息。它还讨论了其生命周期以及Android如何优先使用其内存。

你的解释并没有说明为什么当屏幕关闭一段足够长的时间后,服务会被杀死。忘掉wakelock吧,因为它与解释一个活动的进程何时保持完好并在屏幕重新开启时恢复无关。 - Johann
1
当您的设备需要内存时,它可能会杀死整个进程,包括您的活动和服务。正如这个答案所说,这并不保证每次设备进入睡眠状态时都会发生。与此答案所说的相反,当进程被杀死时,onDestroy() 可能不会被调用。 - AsafK

1
Android的活动生命周期非常复杂,即使经过多年的Android核心开发,Romain Guy也表示他并没有完全理解。当应用程序位于后台时,Android操作系统可以根据需要干预您的活动生命周期。活动生命周期仅粗略地表示实际行为,我大多数的理解都是通过经验和试错得出的。
在您的情况下,如果将活动发送到后台,如果Android有可用的RAM,它会尝试将您的活动保留在RAM中,因此它会经历onPause和onStop。现在,这种状态可能会持续到您返回应用程序为止,然后它将通过onStart和onResume,因为您在onCreate中创建的所有引用/字段仍然存在,并且可以“重复使用”。另一方面,如果操作系统决定需要更多内存,则可以销毁您的活动,并且将开放进行垃圾回收,并且还将经历onDestroy()生命周期。下次重新打开应用程序时,将创建一个具有保存的状态的新活动onSaveInstanceState(),并且将运行从onCreate()开始的整个生命周期。

对于服务而言,通常情况下服务不应该长时间运行,一旦服务完成后也应立即停止。因此,如果操作系统发现一个在后台长时间运行的服务,它会在一段任意的时间内(可能还包括其他参数)试图摆脱它以节省电池/内存。另一方面,如果您需要一个长时间运行的服务,您需要手动保持唤醒锁以向操作系统发出信号“无论如何我都需要它完成”。


那个链接到Romain的声明有更新吗?阅读它将会非常有价值,但是可惜我们无法访问! - androidguy

0

@AndroidDev 如果您知道哪些方法在什么时间调用,您将清楚这个问题。以下是在不同场景下调用的方法列表

1)当我们启动活动时,即调用startActivity(intent)此时

onCreate()
onStart()
onResume()

2)活动有几种进入睡眠模式的方式? a)当我们按下锁定按钮时,它会进入睡眠模式并调用以下方法 b)当我们按下概述按钮时,它会进入睡眠模式并调用以下方法 c)当我们从当前活动启动另一个活动时,它会进入睡眠模式并调用以下方法

onPause()
onStop()

3) Activity销毁的方式有几种? a) 如果我们调用finish()方法,它将调用以下方法 b) 如果我们点击返回按钮,它将调用以下方法

onPause()
onStop()
onDestroy()

所以每当活动进入睡眠模式时,它不会调用onDestory()方法,这就是为什么当您从睡眠模式返回时,您的活动不会调用onCreate方法的原因。onCreate()只有在第一次调用startActivity()或者如果销毁活动调用finish()或后退按钮按下时才会被调用,在这两种情况下都会调用destroy()方法。


0
当您按下电源按钮或主页按钮时,Android操作系统会将当前活动放入后台堆栈中。onCreate不再被调用的原因是,它专门用于创建视图和执行一次性记忆操作,例如将xml布局加载到活动中。系统工作方式使得您无需每次进入该页面时都分配内存,而只有在创建页面时才需要。由于您正在恢复到同一活动,因此会调用onResume。在Android中,内存管理非常关键,因为它是移动操作系统。

如果您需要更多澄清,或者认为这个答案没有解决您的疑问,请随时提出。 - kaushal trivedi
我认为按下主页键或电源键并不会将当前活动放入后台堆栈。 - Patrick
如果在执行此操作时调用了onPause方法,则意味着DVM正在将当前Activity放入后台堆栈中。 也许这个链接可以解决你的疑问, https://dev59.com/x2445IYBdhLWcg3wLXIK 请查看Michael关于活动生命周期和内存管理的答案。 - kaushal trivedi

0
简短回答: 当一个Activity被创建时,onCreate()方法会被调用。 设备进入睡眠和恢复的行为被定义为onPause()onResume()方法的调用。设备休眠不会杀死应用程序或活动 - 状态保持(几乎)相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接