好的,我正在设置闹钟:
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent);
,其中
long triggerTime = SystemClock.elapsedRealtime() + mynterval;
我将triggerTime
保存以供日后比较
有时候alarm
会在triggerTime
之前解雇!
例如,我可以在日志中看到:
scanTime: 702672466
SystemClock.elapsedRealtime: 702672132
这里有什么增量误差 - 1秒,2-3秒或更长? 为什么会发生这种情况?
答案 0 :(得分:0)
由于Android Doze Mode而发生这种情况。
如果用户将设备拔出并静止一段时间,屏幕关闭,设备将进入打盹模式。在打盹模式下,系统会通过限制应用程序访问网络和CPU密集型服务来尝试节省电量。
现在,警报是CPU密集型服务的情况。正如您在图像中看到的那样,密集型作业在所谓的维护窗口中一起完成。
标准AlarmManager警报(包括setExact()
和setWindow()
)将推迟到下一个维护窗口。
如果您需要设置在Doze中触发的闹钟,请使用setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。
使用setAlarmClock()
设置的警报会继续正常启动 - 系统会在警报触发前不久退出Doze。