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

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

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

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


person Pentium10    schedule 07.06.2010    source источник
comment
Я видел это в этом примере: google.com/codesearch/p?hl=en#kZ0MkhnKNzw /trunk/Фотопоток/источник/   -  person Pentium10    schedule 08.06.2010


Ответы (3)


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

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

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

person Mark B    schedule 07.06.2010

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

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 ...
    }
person Tom    schedule 02.09.2010
comment
Это точный ответ, какая пожарная сигнализация на следующий день, если время ушло - person Anand Savjani; 12.09.2016

Чтобы будильник сработал через 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.

person Cheryl Simon    schedule 07.06.2010
comment
Мне нужно уйти в определенное время 23:22. У меня уже есть работающее решение, которое сработает за 30 секунд, и оно работает хорошо. - person Pentium10; 08.06.2010