У меня есть этот код
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:22 h
Что я делаю неправильно? Я заметил в первый раз, и c.getTimeInMillis () отличается много по размеру и длине. Когда я использую в первый раз, поэтому, когда установлено на 30 секунд, предупреждение выполняется хорошо.
Вы используете флаг AlarmManager.ELAPSED_REALTIME_WAKEUP
, но вы используете объект Calendar. Эти две вещи не сочетаются.
Вам нужно использовать AlarmManager.RTC или AlarmManager.RTC_WAKEUP
, если вы указываете время сигнала тревоги с помощью объекта Calendar или Date (миллисекунды с 1970 года).
Вы используете AlarmManager.ELAPSED_REALTIME
или AlarmManager.ELAPSED_REALTIME_WAKEUP
, если вы указываете время будильника через SystemClock.elapsedRealtime()
(миллисекунды с момента загрузки телефона).
Чтобы сигнал тревоги сработал через 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 для полного объяснения этих типов.