为什么 AlarmManager 有时无法在5分钟后执行,因为它应该如此?例如,它可能不会起作用,但在下一个时期它可以工作2(或3)次。甚至滞后1分钟。
API 17 (Android 4.2.1) - setRepeating 应该是准确的。
public void scheduleAlarm()
{
Intent intent = new Intent(getApplicationContext(), TestAlarmReceiver.class);
final PendingIntent pIntent = PendingIntent.getBroadcast(this, TestAlarmReceiver.REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
long firstMillis = System.currentTimeMillis();
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 5 * 60 * 1000, pIntent); // every 5 minutes
Log.i(TAG_LOG, "The alarm started");
}
日志:
<...>
17.03.2017 07:20:30
17.03.2017 07:25:30
17.03.2017 07:30:30
17.03.2017 07:40:25 <- this
17.03.2017 07:40:30 <- this
17.03.2017 07:45:30
17.03.2017 07:50:30
17.03.2017 07:55:30
17.03.2017 08:00:30
17.03.2017 08:10:25 <- this
17.03.2017 08:10:30 <- this
17.03.2017 08:15:30
17.03.2017 08:20:30
<...>
17.03.2017 16:50:30
17.03.2017 16:55:30
17.03.2017 17:01:10 <- this
17.03.2017 17:05:30
17.03.2017 17:10:30
17.03.2017 17:15:30
17.03.2017 17:21:08 <- this
17.03.2017 17:25:30
17.03.2017 17:40:29 <- this
17.03.2017 17:40:29 <- this
17.03.2017 17:40:30 <- this
17.03.2017 17:45:30
17.03.2017 17:51:09 <- this
17.03.2017 17:55:30
17.03.2017 18:00:50
<...>
答案 0 :(得分:0)
setRepeating()
不应该按照你想要的方式工作。
setExact()
会在确切时间触发闹钟,但由于没有setExactRepeating()
方法,您需要使用setExact()
,并在BroadcastReceiver
中调用{{ 1}}再次运作。
没有简单的方法可以做到这一点,因为谷歌试图向你指出这对电池不利。如上所述使用setExact()
是您完全重复的唯一选择。