【问题标题】:Android AlarmManager elapsedTime fires wrongAndroid AlarmManager elapsedTime 触发错误
【发布时间】:2016-06-23 12:14:12
【问题描述】:

好的,我要设置闹钟了:

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent);

在哪里

long triggerTime = SystemClock.elapsedRealtime() + mynterval;

我正在保存triggerTime 以供将来比较。
有时alarmtriggerTime 之前触发!

例如,我可以在日志中看到:

scanTime: 702672466
SystemClock.elapsedRealtime: 702672132

这里可能出现什么增量错误 - 1 秒、2-3 秒或更长时间?
为什么会这样?

【问题讨论】:

  • 您正在测试哪个 Android 版本?
  • 如果我使用setExact() - 然后是 5.1.1 的设备;如果是较早的设备 - 我改用 set() 方法。
  • 好吧,看看我关于打盹模式的回答。无论如何,增量是第二个(最坏的情况),它会以毫秒为单位

标签: android alarmmanager elapsedtime


【解决方案1】:

这是由于Android Doze Mode 而发生的。

如果用户在屏幕关闭的情况下将设备不插电并静止一段时间,则设备会进入打盹模式。在打盹模式下,系统会尝试通过限制应用访问网络和 CPU 密集型服务来节省电池电量。

现在,警报是 CPU 密集型服务的情况。正如您在图片中看到的那样,密集的工作是在所谓的维护窗口中一起完成的。

标准 AlarmManager 警报(包括 setExact()setWindow())推迟到下一个维护时段。 如果您需要设置在打瞌睡时触发的警报,请使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()。 使用setAlarmClock() 设置的警报会继续正常触发 - 系统会在这些警报触发前不久退出 Doze。

【讨论】:

  • 有趣的是,该设备已插入 PC,并且在该错误期间屏幕处于打开状态。由于该模式,警报可能会在触发时间后触发。但在我的情况下,警报之前已经响起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多