如何以准确的时间间隔使用警报管理器?
我使用了警报管理器,但响应不准确。 谁能帮我? 我用过这段代码
PendingIntent sender;
AlarmManager am;
long firstTime;
Intent itnt = new Intent();
itnt.setAction("abts.medismo.medismo.ALARMRECEIVER");
sender = PendingIntent.getBroadcast(context, 0,itnt, 0);
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);
firstTime = SystemClock.elapsedRealtime();
am.setInExactRepeating(AlarmManager.ELAPSED_REALTIME,firstTime, Integer.parseInt(sep[3]), sender);
答案 0 :(得分:3)
你应该使用ELAPSED_REALTIME_WAKEUP
,因为如果手机处于睡眠状态,它会在它再次醒来之前开火。
答案 1 :(得分:1)
这里有两个问题。
正如其他人所指出的那样,第一个是警报不是“唤醒”警报。这意味着如果设备在达到触发时间时处于睡眠状态,则警报不会导致设备唤醒并立即处理警报。相反,只要其他东西导致设备变为活动状态,它就会被处理,例如用户捡起它并按下电源按钮开始使用它。
第二个问题是您正在使用setInexactRepeating()
。顾名思义,这些警报永远不会在精确可预测的时间交付。正如文件所述,“此外,虽然重复警报的整个周期将按要求进行,但任何两次连续发出警报之间的时间可能会有所不同。”
对于大多数应用来说,这通常已经足够了,而且在电池使用方面效率更高。但是,如果您确实需要在特定时间发送警报,则需要自己设置警报时间,而不是依赖于定期警报。此外,从API版本19开始,如果您确实需要精确交付,则应使用新的setExact()
API。
答案 2 :(得分:0)
我相信您观察到的不准确可能是由警报标志的细微变化引起的。
AlarmManager.ELAPSED_REALTIME
和AlarmManager.ELAPSED_REALTIME_WAKEUP
使用elapsedRealtime()
,这是自设备上次启动以来的毫秒数,有助于测量计时器的运行时间等。
AlarmManager.RTC
和AlarmManager.RTC_WAKEUP
使用currentTimeMillis()
,这是系统时钟:
自1970年1月1日00:00:00 UTC以来的时间(以毫秒为单位)。此方法不应用于测量超时或其他经过时间的测量,因为更改系统时间会影响结果。
我列出的所有四个AlarmManager
时钟标志都包含睡眠时间,但只有*_WAKEUP
标志会唤醒设备以发出警报;默认标志将等待设备被唤醒,然后立即发出警报。
确保选择与您的用例匹配的标志,并确保延迟{Integer
在sep[3]
?}的值是以毫秒为单位的警报之间等待的时间;正如你所拥有的那样,你的Integer
正在被取消装箱并投入很长时间;它有效,但除非有理由,我建议切换到原始long
;因此延迟15分钟:
int delay = 900000L // 15 minutes * 60 seconds * 1000 milliseconds
http://developer.android.com/reference/android/app/AlarmManager.html
http://developer.android.com/reference/android/os/SystemClock.html