AlarmManager 立即启动警报

AlarmManager start Alarm Instantly

我创建了一个表单,用户可以在其中指定日期和时间并添加警报。我使用这些日期和时间并使用 AlarmManager 创建警报。

问题是我一点击 CreateRemainder 按钮,警报就被触发了

我正在使用以下方法将日期、时间值传递给 AlarmManager class。

int year= Integer.parseInt(splitDate[0]);
int month= Integer.parseInt(splitDate[1]);
int day= Integer.parseInt(splitDate[2]);

int hour= Integer.parseInt(splitTime[0]);
int minute= Integer.parseInt(splitTime[1]);
int second= 0;


Calendar cal = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
cal.set(Calendar.DATE,day);  //1-31
cal.set(Calendar.MONTH,month-1);  //first month is 0!!! January is zero!!!
cal.set(Calendar.YEAR,year);//year...

cal.set(Calendar.HOUR_OF_DAY, hour);  //HOUR
cal.set(Calendar.MINUTE, minute);       //MIN
cal.set(Calendar.SECOND, second);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

我调试了它并获得了正确的值,但它立即启动警报。 如果我将 AlarmManager 时间更改为硬编码的 10 秒时间,它会在 10 秒后开始余数。

alarmManager.set(AlarmManager.RTC_WAKEUP,  System.currentTimeMillis() + (10 * 1000), pendingIntent);

但是如果我在日历上添加 10 秒,它仍然会在设置后立即开始显示闹钟。

 alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+10000, pendingIntent);

使用这个:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
    }

如果你的闹钟是立即响起的,那么我猜你的 cal 日期早于今天。

通常,如果警报在您设置后立即触发,则意味着预定时间晚于当前时间...因此,AlarmManager 会立即触发

我建议添加调试消息进行调试。类似于:

Log.d("DEBUG", "Time from device: " +  Calendar.getInstance().getTimeInMillis() + " Time passed to alarm: " + cal.getTimeInMillis());

然后,您可以查看 Current Millis 网站并检查两个时间是否正确.. 检查 cal 是否真的是未来日期

另外,如果你想在日历中添加时间,使用如下Calendar.add()方法:

Calendar cal = Calendar.getInstance();

cal.add(Calendar.SECOND, 10);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);