Как правильно настроить будильник в фиксированное время?

У меня есть этот код

Calendar c = new GregorianCalendar(); c.add(Calendar.DAY_OF_YEAR, 1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 22); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); // We want the alarm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); firstTime += 30*1000; long a=c.getTimeInMillis(); // Schedule the alarm! AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, c.getTimeInMillis(), 1*60*60*1000, sender); 

Он не выполняется в 23: 22h

Что я делаю неправильно? Я заметил, что firstTime и c.getTimeInMillis () сильно отличаются по размеру и длине. Когда я использую firstTime, поэтому, когда установлено значение 30 секунд, будильник выполняется хорошо.

    Вы используете флаг AlarmManager.ELAPSED_REALTIME_WAKEUP , но используете объект Calendar. Эти две вещи не идут вместе.

    Вам нужно использовать AlarmManager.RTC или AlarmManager.RTC_WAKEUP если вы указываете время будильника, используя объект Calendar или Date (миллисекунды с 1970 года).

    Вы используете AlarmManager.ELAPSED_REALTIME или AlarmManager.ELAPSED_REALTIME_WAKEUP когда вы указываете время будильника через SystemClock.elapsedRealtime() (миллисекунды с момента загрузки телефона).

    У меня был успех со следующим кодом, если вы только хотите установить будильник для следующего события hh: mm

     Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.HOUR_OF_DAY, 22); cal.set(Calendar.MINUTE, 19); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); //check if we want to wake up tomorrow if (System.currentTimeMillis() > cal.getTimeInMillis()){ cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ... } 

    Чтобы сигнал тревоги погаснет через 30 секунд, используйте

     Calendar cal = Calendar.getInstance(); 

    Для получения текущего времени, а затем

     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

    Редактировать:

    Я думаю, что проблема заключается в ELAPSED_REALTIME_WAKEUP. Это сообщает AlarmManager, что время, которое вы даете, основано на времени с момента запуска системы. Это нормально в течение 30 секунд, но если вы хотите, чтобы это было основано на реальном времени, вы должны использовать RTC или RTC_WAKEUP. См. Javadoc для полного объяснения этих типов.