Android AlarmManager elapsedTime触发错误

时间:2016-06-23 12:14:13

标签: android alarmmanager elapsedtime

好的,我正在设置闹钟:

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

,其中

long triggerTime = SystemClock.elapsedRealtime() + mynterval;

我将triggerTime保存以供日后比较 有时候alarm会在triggerTime之前解雇!

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

scanTime: 702672466
SystemClock.elapsedRealtime: 702672132

这里有什么增量误差 - 1秒,2-3秒或更长? 为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

由于Android Doze Mode而发生这种情况。

  

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

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

enter image description here

标准AlarmManager警报(包括setExact()setWindow())将推迟到下一个维护窗口。 如果您需要设置在Doze中触发的闹钟,请使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()。 使用setAlarmClock()设置的警报会继续正常启动 - 系统会在警报触发前不久退出Doze。