报警管理器准确性

时间:2012-11-02 07:20:54

标签: android

如何以准确的时间间隔使用警报管理器?

我使用了警报管理器,但响应不准确。 谁能帮我? 我用过这段代码

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);

3 个答案:

答案 0 :(得分:3)

你应该使用ELAPSED_REALTIME_WAKEUP,因为如果手机处于睡眠状态,它会在它再次醒来之前开火。

答案 1 :(得分:1)

这里有两个问题。

正如其他人所指出的那样,第一个是警报不是“唤醒”警报。这意味着如果设备在达到触发时间时处于睡眠状态,则警报不会导致设备唤醒并立即处理警报。相反,只要其他东西导致设备变为活动状态,它就会被处理,例如用户捡起它并按下电源按钮开始使用它。

第二个问题是您正在使用setInexactRepeating()。顾名思义,这些警报永远不会在精确可预测的时间交付。正如文件所述,“此外,虽然重复警报的整个周期将按要求进行,但任何两次连续发出警报之间的时间可能会有所不同。”

对于大多数应用来说,这通常已经足够了,而且在电池使用方面效率更高。但是,如果您确实需要在特定时间发送警报,则需要自己设置警报时间,而不是依赖于定期警报。此外,从API版本19开始,如果您确实需要精确交付,则应使用新的setExact() API。

答案 2 :(得分:0)

我相信您观察到的不准确可能是由警报标志的细微变化引起的。

AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP使用elapsedRealtime(),这是自设备上次启动以来的毫秒数,有助于测量计时器的运行时间等。

AlarmManager.RTCAlarmManager.RTC_WAKEUP使用currentTimeMillis(),这是系统时钟:

  

自1970年1月1日00:00:00 UTC以来的时间(以毫秒为单位)。此方法不应用于测量超时或其他经过时间的测量,因为更改系统时间会影响结果。

我列出的所有四个AlarmManager时钟标志都包含睡眠时间,但只有*_WAKEUP标志会唤醒设备以发出警报;默认标志将等待设备被唤醒,然后立即发出警报。

确保选择与您的用例匹配的标志,并确保延迟{Integersep[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