【问题标题】:Android's activity lifecycle after coming out of sleep睡醒后的 Android Activity 生命周期
【发布时间】:2013-07-06 06:32:23
【问题描述】:

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

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

【问题讨论】:

  • 最终你想要什么!
  • 当然,这是我想要的,但我的问题是发生了什么。如果处理程序和线程没有被破坏,我只能假设 Android(或硬件)能够“暂停”所有进程的状态(除了像 AlarmManager 这样的进程),然后在设备到来时“取消暂停”这个状态退出睡眠模式。我想这只能通过设备的架构来实现,以节省电池。真正有趣的是,如果这是真的,为什么后台服务在退出睡眠模式时不保持活动状态。他们可以而且确实会在睡眠模式下被杀死。

标签: android android-activity lifecycle


【解决方案1】:

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

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

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

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

【讨论】:

  • 您的解释没有解释为什么当屏幕关闭足够长的时间时服务会被终止。忘记唤醒锁,因为它与解释为什么活动的进程保持完整并在屏幕重新打开时恢复的解释无关。
  • 当您的设备需要内存时,它会杀死您的整个进程。这包括您的活动和服务。正如在这个答案中所说,每次设备进入睡眠状态时都不能保证会发生这种情况。与此答案中所说的相反,当进程被杀死时,可能不会调用 onDestroy()。
【解决方案2】:

Android的Activity生命周期极其复杂,甚至Romain Guy states he doesn't understand it fully经过多年的android核心开发。您可以假设 Android 操作系统可能会干扰您的活动生命周期,当它在后台时看起来很合适。 activity lifecycle 只是非常粗略地代表了实际行为,主要是我通过经验和跟踪和错误得到了我的理解。

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

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

【讨论】:

  • Romain 声明的链接有更新吗?会是这样的宝石阅读,但可惜,我们不能!
【解决方案3】:

当您按下电源按钮或主页按钮时,android 操作系统会将您当前的活动放入后台堆栈, 没有再次调用 onCreate 的原因是,它专门用于创建视图并执行一次性内存操作,例如将您的 xml 布局加载到活动中。系统的工作方式是您不必每次访问该页面时都分配内存仅当您创建 page.onResume 时才会调用,因为您要恢复到相同的活动。 内存管理在 Android 中非常重要,因为它是一个移动操作系统。

【讨论】:

  • 如果您需要,或者您认为此答案没有针对您的疑问,请要求更多说明。
  • 我不认为按主页或按电源按钮确实会将当前活动放在后台堆栈中。
  • 如果在执行此操作时调用了 onPause 方法,则意味着 DVM 正在将当前 Activity 放入 backstack。可能这个链接可以解决您的疑问,stackoverflow.com/questions/5001682/… 请参阅 Michael 关于活动生命周期和内存管理的回答。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    @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() 方法。

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2013-07-10
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多