Как правильно установить будильник в установленное время? - PullRequest
6 голосов
/ 08 июня 2010

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

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

Ответы [ 3 ]

10 голосов
/ 08 июня 2010

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

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

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

8 голосов
/ 03 сентября 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 ...
    }
4 голосов
/ 08 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...