AlarmManager警报在错误的时间响起

时间:2018-05-22 16:06:00

标签: android broadcastreceiver alarmmanager

我正在尝试使用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实例是否未考虑时区?我在这里做错了什么?

1 个答案:

答案 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)预期的精确触发。