Android:如何在Android设备上查看睡眠阶段/水平?

14

安卓系统中是否有睡眠阶段/级别的概念?

从浏览邮件列表得知,存在一种名为"深度睡眠"的阶段。当设备进入此状态时,所有应用程序的执行是否会停止?如果是,则除了用户按下电源按钮外,还有什么可以唤醒设备?

5个回答

21

从邮件列表中了解到,存在一种被称为“深度睡眠”的阶段。

实际上,并不存在一个专门称之为“深度睡眠”的阶段。只有“清醒”、“睡眠”和“关闭”这三个状态。

在设备进入此状态后,所有应用程序的执行是否都停止了?

当设备进入睡眠或关闭状态时,所有进程的执行都会停止。

如果是这样的话,除了用户按下电源按钮,还有什么其他方式可以唤醒设备?

  • 来自AlarmManager的闹钟
  • 来电电话
  • 收到短信
  • 如果您在无线数据(非WiFi)上打开了套接字,则该套接字上的传入数据包

以上是最常见的,还可能有其他方式。


3
@zer0stimulus:并不是真的。很难告诉你 CPU 在睡眠模式下是被关闭电源的,因为 CPU 在睡眠模式下确实是被关闭电源的。同样地,很难告诉你设备已经关机,因为设备确实已经关机了。还有一些广播 Intent 与这些状态有所关联(例如 ACTION_SCREEN_OFF),但仅此而已。 - CommonsWare
1
设备要保持唤醒状态多久?在读取套接字以处理消息后,我们是否应立即获取唤醒锁? - Erdal
1
@randomaspirer:大概是吧,因为每个都应该涉及到明确的“Intent”。话虽如此,我还没有测试过这些情景。 - CommonsWare
1
@CommonsWare 从你的书中得到答案,它说从Android 3.1+开始,强制停止后除非用户再次打开应用程序来重新调度,否则不会发生任何事情。这是否意味着进程被杀死而不是为闹钟管理器事件重新创建? - KingKongCoder
1
@randomaspirer:啊,是的。我一直在关注应用程序组件是否能够运行,忘记了闹钟和任务将被删除的事实。对此感到抱歉! - CommonsWare
显示剩余9条评论

4
我注意到以下行为: 1. 您打开了活动并停止与其交互。 2. 几秒钟后(这取决于设备的配置),屏幕会关闭。 当屏幕关闭时,会调用onSaveInstance和onPause。 3. 几秒钟后(通常约15秒),设备进入睡眠模式(这是正确的名称吗?) 当发生这种情况时,将调用以下方法:onStop(调用isFinishing返回false),onRetainNonConfigurationInstance和onDestroy。 到目前为止都还好,现在奇怪的行为开始了:就在最后一个onDestroy完成之后,另一个活动被创建:调用onCreate、onStart、onRestoreInstanceState、onResume和最后一个是onPause。 我找不到这种奇怪行为的原因。为什么要创建另一个活动,直接进入暂停模式呢?这种情况发生在原始活动的onDestroy之后立即发生! 这是在Galaxy S上测试的。我没有测试长时间没有活动后会发生什么。我不确定是否还会发生其他任何事情。 希望这可以帮助您。

1
在Android API 23中,“休眠”模式的工作方式已经改变。他们添加了Doze和App Standby。您可以在此处阅读有关它们的详细信息。
Doze:这就是“睡眠”模式。屏幕关闭几分钟后,手机将进入此模式,关闭所有网络连接。然后,在一定时间间隔(例如线性回退策略)内,应用程序将被“允许”访问网络约10秒钟。如果您想将应用程序发布到Google Play之外,没有使用Google FCM,那么没有真正的解决方法。值得注意的是,在Doze期间,uptimeMillis (链接2)不能保证更新,因为CPU可能会进入深度睡眠模式(elapsedRealtime (链接3)仍将准确)。
App Standby:如果设备确定应用程序处于“空闲”状态,则将完全停止您的应用程序。空闲应用程序的状态由以下因素确定。
用户是否启动了应用?应用是否运行前台服务?应用是否生成了通知?应用是否是主动设备管理应用?如果所有这些答案都是否定的,该应用将被设置为“闲置”,并且其网络访问权限将大大受到限制(仅在每天一次和/或充电时允许访问)。我不确定应用必须满足这些条件多长时间才能进入应用待机状态。然而,似乎至少需要几天时间。
额外信息:设备状态(由DeviceIdleController管理)
- 活动状态 - 正在使用,或连接到电源。 - 非活动状态 - 设备已退出活动状态(用户关闭屏幕或断开电源)。 - 待机挂起状态 - 即将进入待机模式。 - 待机状态 - 设备处于空闲状态(与从应用待机标记为空闲不同。这是整个设备)。 - 维护待机状态 - 开放给应用程序进行处理(10秒窗口)。
如果你想让后台服务或工作程序检查应用是否处于IDLE状态,那么可以使用函数isDeviceIdleMode(仅在进入Deep Doze时有效,请参见下文)。
示例:
(getSystemService(Context.POWER_SERVICE) as PowerManager).isDeviceIdleMode

一些更加复杂的情况:
  1. API 24增加了Doze模式的更多复杂性(轻度Doze和深度Doze)。这实际上在设备状态内嵌套了状态。
  2. API 28添加了“自适应电池”预测,利用Doze来休眠操作系统确定用户不会使用的用户应用程序。
  3. API 28还添加了“应用程序待机桶”,以添加比仅有空闲和活动状态更多的应用程序待机状态。

1

对Commonsware的列表进行简短补充。在寻找一种在手机休眠时定期运行方法的方式后,我发现TimerTask在睡眠模式下也可以正常工作。

根据我的经验,如果您只想从服务中运行方法而不是启动活动,则使用TimerTask更容易操作。


2
有趣的是,在http://groups.google.com/group/android-developers/browse_thread/thread/9e2878053a422718的结尾处,Mark Murphy明确指出TimerTask“不会阻止设备进入睡眠状态,也不会唤醒设备。” - Giulio Piancastelli

0
除了@CommonsWare提到的“唤醒”、“睡眠”和“关闭”状态之外,还有CPU是否处于睡眠状态或仅屏幕处于睡眠状态的区别。例如,官方文档是这样描述的:

为了避免耗尽电池,Android设备在空闲时会很快进入睡眠状态。但是,有时应用程序需要唤醒屏幕或CPU并保持其唤醒以完成一些工作。[强调添加]

在@CommonsWare描述的三阶段框架中,如果设备的屏幕黑暗,则可能不被归类为“睡眠”,除非CPU也停止运行。但正如上面的段落所示,屏幕黑暗状态可以合法地称为“睡眠”。毫无疑问,这就是人们提到“深度睡眠”的原因,以澄清他们正在谈论CPU是否处于睡眠状态。 此文档页面也提到了这一点。
当Android设备处于空闲状态时,它会先变暗,然后关闭屏幕,最终关闭CPU。这可以防止设备的电池快速耗尽。
因此,如果您想全面了解,可以将“变暗”添加到“睡眠阶段/级别”的列表中:
1.唤醒 2.变暗 3.关闭屏幕 4.CPU关闭(真正的“睡眠”或“深度睡眠”) 5.关机
显然,在空闲超时发生时,从2到3到4的转换非常快。但是,在播放音频时(至少在某些应用程序中),屏幕可以关闭而不会转换为深度睡眠。
我希望我能告诉您如何预测设备何时从关闭屏幕转换为关闭CPU-例如,超时时间有多长-但我没有找到该信息。我找到的是FLAG_KEEP_SCREEN_ON和WAKE_LOCK,以防止其中一个发生。

附言:如果你想详尽一点,你可以把白日梦算在你的“睡眠阶段”列表中:

Daydream是Android 4.2版本后的新型交互式屏幕保护模式。当设备插入底座或者插上充电器后闲置时(而不是关闭屏幕),它会自动激活。

从之前运行的应用程序的角度来看,白日梦的行为就像切换到另一个应用程序一样。因此,这并不是设备进入睡眠状态的问题,虽然你的活动确实会停止,我想。


是的,我明白了,可能我忘记了,对此很抱歉。 - KingKongCoder

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