10

我在用着

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 0, DURATION, broadcast);

安排仅应在设备未休眠时执行的重复任务。据我了解 AlarmManager 上的API,一旦设备从睡眠中唤醒,就会调用意图。

现在安卓设备什么时候睡着了?为了进行测试,我将持续时间设置为两分钟并将设备连接到我的机器。现在我正在看 logcat,每两分钟它就会吐出我的调试消息。

我一直认为停用的屏幕意味着设备开始休眠。还是我正在查看调试输出以防止设备进入睡眠状态?我还断开了 USB 连接并在半小时后查看了日志,即使显示屏变暗超过 15 分钟,我也可以看到对我的计时器代码的调用。

如何验证命令不再执行的时间以及 AlarmManager 文档中的 sleep 指的是什么?当设备开始睡眠时,有没有办法从 logcat 输出中看到?

4

2 回答 2

8

关闭的屏幕不一定表示设备处于睡眠状态。应用程序可以请求唤醒锁,以在屏幕关闭时保持设备唤醒。如果另一个应用程序有一个不使用不精确重复的计时器,那么设备也会为此唤醒。

根据您设备上的 Android 版本,您可以在设置 -> 关于手机 -> 电池使用 -> 然后单击顶部的图表中找到您的清醒时间图表。有关唤醒锁的更多信息,请访问http://developer.android.com/reference/android/os/PowerManager.html

于 2011-02-28T14:35:26.873 回答
7

当没有运行应用程序阻止设备进入睡眠状态时,设备处于睡眠状态。所以: 1. 屏幕关闭(当它打开时,总是有一些正在运行的应用程序,例如Launcher) 2. 没有正在运行的服务(例如音乐、下载) - 没有 CPU 锁定。

AlarmManager 将设备从睡眠中唤醒,运行要运行的内容。例如,从警报中结束在广播接收器中创建的服务以让设备再次进入睡眠状态是至关重要的。如果您在后台做某事较长且重要,您应该为您的应用获取 CPU 锁,以防止它被 Android 操作系统杀死。

“我如何验证命令不再执行的时间”到底是什么意思?什么命令?

来自 JavaDoc:

已注册的闹钟在设备处于睡眠状态时会保留(如果在此期间它们响起,可以选择唤醒设备),但如果关闭并重新启动,则会被清除。

因此操作系统会保留所有警报,设备可以被睡眠时发出的警报唤醒。重新启动后会删除警报(您应该将它们保存在数据库中并在重新启动后恢复它们)。

“当设备开始睡眠时,有没有办法从 logcat 输出中看到?” 据我所知没有,我只能在屏幕熄灭时看到这样的东西:

*** set_screen_state 0来自“电源”标签

恕我直言,您不应该为睡眠模式而烦恼,只需通过在需要时处理屏幕关闭和打开意图(Intent.ACTION_SCREEN_OFF)来让您的应用成为“优秀的 Android 公民”,尽快完成服务,尽快释放资源(网络、GPS、CPU),使用不准确的警报,下载管理器,以及操作系统带来的所有优秀员工。我相信 Android 会透明地处理 CPU 睡眠。

于 2011-03-01T23:39:22.790 回答