我正在尝试使用AlarmManager创建一个示例警报应用程序。但是,即使我已设置触发它的特定时间,闹钟也会在不同时间响起。
设置闹钟:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 18); // trigger at 6 PM
Intent notifyIntent = new Intent(context, CheckupAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast
(context, 100, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
android.app.AlarmManager alarmManager = (android.app.AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.setInexactRepeating(android.app.AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
android.app.AlarmManager.INTERVAL_DAY, pendingIntent);
}
清单:
<receiver
android:name=".notifications.CheckupAlarmReceiver"
android:enabled="true"
android:exported="false" />
要重新进行迭代,警报工作正常。它只是在错误的时间发射。 Calendar实例是否未考虑时区?我在这里做错了什么?
答案 0 :(得分:2)
您正在设置setInexactRepeating()
,正如其名称所示,它无法在您指定的确切时间触发。这是一个优化,因此操作系统会尝试获取多个警报,这些警报应在相似的时间触发,同时触发所有警报。
相反,您可以使用void setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
。请参阅documentation。
示例:
alarmManager.setExactAndAllowWhileIdle(android.app.AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
根据建议,您不应使用具有确切时间的重复警报。相反,您可以等到确切的警报触发,然后为第二天安排另一个警报。
对于低于23的API,您可以使用void setExact(int type, long triggerAtMillis, PendingIntent operation)
。对于低于19的API,您可以像往常一样使用void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
预期的精确触发。