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

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

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 секунд, предупреждение выполняется хорошо.

6
задан Pentium10 7 June 2010 в 20:37
поделиться

2 ответа

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

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

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

10
ответ дан 8 December 2019 в 05:53
поделиться

Чтобы сигнал тревоги сработал через 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 для полного объяснения этих типов.

4
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: