当时间设置为0:00时,立即调用警报

时间:2016-09-27 07:36:58

标签: android alarmmanager android-alarms android-calendar

我发出的警报会像用户选择的小时和分钟上的任何其他警报一样激活。当时间设置为0时,我发现了一个问题,警报立即激活。

我有一个自定义AlarmManager,其中我称之为重复计划:

CustomAlarmManager alarmManager = new CustomAlarmManager(getActivity());
alarmManager.scheduleRepeatingAlarm(getActivity(),
    alarmID, alarmHour, alarmMinute);

对于有问题的例子,这些值正在传递:

Id = 619
Hour = 0
Minute = 0

这是setRepeatingAlarm()函数:

public void scheduleRepeatingAlarm(Context context, int alarmID, int hour, int minute) {
    System.out.println("schedule is running");
    Intent intent = new Intent(context, AlarmNotificationReciever.class);
    Bundle extras = new Bundle();
    extras.putBoolean(KEY_REPEAT, true);
    extras.putInt("AlarmId", alarmID);
    intent.putExtras(extras);
    PendingIntent pIntent = PendingIntent.getBroadcast(context,
        alarmID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    Calendar calender = Calendar.getInstance();
    calender.set(Calendar.HOUR_OF_DAY, hour);
    calender.set(Calendar.MINUTE, minute);

    if (android.os.Build.VERSION.SDK_INT >= 19) {
        setSingleExactAlarm(calender.getTimeInMillis(), pIntent);
    } else {
        mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            calender.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent);

    }
}

我假设这个问题与这些问题一致:

Calendar calender = Calendar.getInstance();
calender.set(Calendar.HOUR_OF_DAY, hour);
calender.set(Calendar.MINUTE, minute);

设置闹钟时的这一行:

setSingleExactAlarm(calender.getTimeInMillis(), pIntent);

对于其他时间和分钟的组合,它似乎起作用并将其视为一个时间。但是对于小时= 0和分钟= 0,它只是直接射击。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是预期的行为。

Calendar.getInstance()会将Calendar实例设置为当前日期/时间。

保持日期不变,将小时和分钟字段设置为0,可以有效地设置过去的警报(被视为错过警报)。

来自setRepeating()的{​​{3}}:

  

如果指定的触发时间是过去的,则会触发警报   立即,报警数量取决于过去的距离   触发时间相对于重复间隔。

您可以执行以下操作来执行检查:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);

Calendar now = Calendar.getInstance();

if(calendar.before(now)) {
    // handle this as you wish

    // adding a day to calendar
    calendar.add(Calendar.DATE, 1);
}