如何防止警报在启动时运行通过的时间

时间:2014-02-28 10:06:14

标签: android alarmmanager

我有一个带RTC闹钟的应用程序。目前我将闹钟设置为每天上午8:00开启。我的问题是,当闹钟开始时(下午4:00),它会考虑过去的开始时间(8AM),因此会运行。

我希望闹钟仅在早上8点左右运行,但如果它在当天晚些时候开始,则不会运行。知道怎么样?

3 个答案:

答案 0 :(得分:3)

我建议您使用calendar.add(Calendar.DAY_OF_YEAR, 1);

研究以下代码:

Calendar calendar = Calendar.getInstance();
// 9 AM 
calendar.add(Calendar.DAY_OF_YEAR, 1);   ///to avoid firing the alarm immediately
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
PendingIntent pi = PendingIntent.getService(context, 0,
            new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                                AlarmManager.INTERVAL_DAY, pi);

Original Source

答案 1 :(得分:1)

您正在使用setInexactRepeatingsetRepeating,对吧?因此,要处理这种情况,只需比较2次:以msecs为单位的当前时间和以msecs为单位的当前时间(8AM,当前日期)。如果第一次超过第二次,那么你应该在(第二天上午8点)触发警报,如果没有 - (上午8点,当天)。

答案 2 :(得分:0)

就我而言,如果时间还没有过去,我希望警报在当天触发,因此我需要对Lucifer的回答进行一些改进。

void setTheAlarm(int hour, int minute)
{
    SettingsData.TriggerTime triggerTime = common.settingsData.getDeviceParamInfo().getConnectionTime();

    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, 0);


    if(System.currentTimeMillis() > calendar.getTimeInMillis())
    {
        calendar.add(Calendar.DAY_OF_YEAR, 1);   ///to avoid firing the alarm immediately
    }

    // With setInexactRepeating(), you have to use one of the AlarmManager interval
    // constants--in this case, AlarmManager.INTERVAL_DAY.
    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);

    Log.i("setTheAlarm", String.format("Alarm is set to %02d:%02d", hour, minute));
}