AlarmManager立即启动报警

时间:2016-07-25 12:56:15

标签: android android-layout alarmmanager android-alarms

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

问题是,只要我点击CreateRemainder按钮,就会触发警报

我使用以下方法将日期,时间值传递给AlarmManager类。

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);

2 个答案:

答案 0 :(得分:1)

使用此:

 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的日期是在今天之前。

答案 1 :(得分:1)

通常情况下,如果警报一旦设置就会被触发,则表示预定时间在当前时间之后......所以,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);