10

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

onResume 被调用,它被记录为活动生命周期的一部分。我不明白为什么 onCreate 不再被调用。退出睡眠模式后,按钮的点击监听器怎么可能起作用?你会认为 Android 已经销毁了所有附加到 Activity 的正在运行的进程,其中包括按钮的点击监听器。

4

5 回答 5

3

你什么意思,为什么不onCreate()被再次调用?

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

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

我认为重要的是要指出睡眠模式和关闭屏幕不是一回事。当您关闭屏幕时,它可能会或可能不会立即进入睡眠模式。当屏幕熄灭但尚未进入睡眠模式时,cpu 仍在工作,服务仍在运行。当手机进入睡眠模式时,它会关闭 CPU,本质上是“冻结”所有进程,结果services也是所有进程。使用唤醒锁可以防止手机进入睡眠模式,这就是为什么在手机屏幕长时间关闭时服务仍会运行的原因。如果您还没有阅读它,那么该Service参考资料 有一些非常好的信息。它还讨论了它的生命周期以及 Android 如何确定其内存使用的优先级。

于 2013-07-06T07:17:33.853 回答
1

Android 的 Activity 生命周期极其复杂,甚至Romain Guy 也表示,经过多年的 Android 核心开发,他并不完全理解它。您可以假设 Android 操作系统会干扰您的活动生命周期,当它在后台时看起来很合适。活动生命周期仅非常粗略地代表了实际行为,主要是我通过经验和跟踪和错误得到了我的理解。

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

服务也是如此。通常服务不应该运行很长时间,他们也应该在完成后立即停止自己。因此,如果操作系统发现一个在后台运行了很长时间的服务,它会在一段时间后尝试摆脱它以节省电池/内存(也许其他参数包含在这个决定中)。另一方面,如果您需要长时间运行的服务,则需要手动保持唤醒锁以向操作系统发出信号“无论如何我都需要这样做”。

于 2013-07-06T13:23:27.107 回答
0

When you press power button or home button ,android OS put your current activity onto back stack, Reason why onCreate doesnt get called again is,it is specifically made to create views and to do one time memory operation like loading your xml layout into activity.The system works such as you dont have to allocate memories each time you come on that page instead only when you created the page.onResume gets called because you are resuming back to the same activity. Memroy Managment is very crucial in Android as it is a mobile operating system.

于 2013-07-06T13:48:36.487 回答
0

简短的回答: 在创建onCreate()a 时被调用Activity。设备进入睡眠并返回的行为被定义为onPause()onResume()调用。设备睡眠不会杀死应用程序或活动 - 状态保持(几乎)相同。

于 2014-01-30T00:27:18.363 回答
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()才会调用。

于 2018-10-03T07:21:46.053 回答