3

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

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

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

3 回答 3

3

您应该使用ELAPSED_REALTIME_WAKEUP,因为如果手机处于睡眠状态,它在再次唤醒之前不会启动。

于 2012-11-02T07:32:25.893 回答
2

这里有两个问题。

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

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

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

于 2016-01-21T01:29:16.943 回答
0

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

AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP利用elapsedRealtime(),这是自设备上次启动以来的毫秒数,适用于测量计时器等的经过时间。

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

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

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

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

于 2012-11-02T07:46:01.203 回答