Отправлять намерения каждый день с помощью AlarmManager?

Я хочу следующее:

  • AlarmManager отправляет ежедневное намерение моему AppWidgetProvider ТОЧНО в полночь.
  • Будильник должен разбудить устройство.

Вот как я это сделал:

В моем подклассе AppWidgetProvider:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    Log.d(LOG_TAG, "Widget Provider enabled.  Starting timer");

    //Setting the Calender object to midnight time.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 0);
    calendar.add(Calendar.MINUTE, 0);
    calendar.add(Calendar.HOUR, 0);

    //The fired Intent
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE); //custom intent name
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
        calendar.getTimeInMillis(), 1000*60*60*24, pendingIntent);
}

Хотя я думаю, что сделал все правильно, этот код не работает!

Чтобы проверить это, я изменил 1000*60*60*24 на 10000 (10 секунд) и обновил textView в виджете случайным числом. Случайное число никогда не менялось.

Любая помощь будет оценена!


person iTurki    schedule 01.06.2012    source источник


Ответы (2)


Наконец-то я нашел проблему!

Кажется, мне также нужно установить значение AM_PM. Когда я печатаю календарь с помощью getTime().toLocaleString(), он был установлен на следующий день, но через 12 часов (12:00:00 PM).

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
calendar.add(Calendar.DAY_OF_MONTH, 1);

Это идеальная настройка для экземпляра Calender, который установит будильник на на следующий день в полночь (т.е. в ближайшую полночь). Вы просто передаете его setRepeating().

Спасибо @CommonsWare

person iTurki    schedule 25.07.2012

Во-первых, то, что вы хотите, строго невозможно. Android не является RTOS; вы можете не получить управление "ТОЧНО в полночь"

Во-вторых, ваш объект Calendar представляет время в прошлом (если только не полночь в то время, когда вы выполняете этот код, и в этом случае он представляет настоящее). Попробуйте указать время начала в будущем.

person CommonsWare    schedule 01.06.2012
comment
Прочитав код, я обнаружил, что мой объект Calender представляет текущее время. Я использовал add, а не set. Итак, если это так, я должен SET Hour, Min and Sec to zero and ADD 1 to DAY_OF_MONTH ? - person iTurki; 02.06.2012
comment
@iturki: я использовал добавить, а не установить. -- Я сделал ту же ошибку, думая, что вы используете set(). если это так, то я должен... -- да, в полночь, это должно сработать, чтобы дать вам завтрашнюю полночь. - person CommonsWare; 02.06.2012
comment
Я попробую и подожду полночи! - person iTurki; 02.06.2012
comment
@iturki: Или протестируйте его на эмуляторе и измените время эмулятора на несколько минут до полуночи. - person CommonsWare; 02.06.2012
comment
Не работает в эмуляторе! Я даже пытался установить HOUR на 12. Я ждал 5 минут после полуночи, а обновления все еще не было. Есть идеи, почему? - person iTurki; 02.06.2012
comment
@iturki: Calendar работает в 24-часовом формате. Полночь 0. - person CommonsWare; 02.06.2012
comment
Но будильник не сработал в полночь, даже если я установил HOUR на 0. - person iTurki; 04.06.2012