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

1

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

  • 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 в виджет со случайным числом. Случайное число никогда не менялось.

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

Теги:
alarmmanager
android-alarms
android-widget

2 ответа

4
Лучший ответ

Я, наконец, нашел проблему!

Кажется, мне нужно также установить значение 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

2

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

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

  • 0
    После прочтения кода я обнаружил, что мой объект Calender представляет текущее время. Я использовал add не set . Итак, если это так, я должен установить SET Hour, Min and Sec to zero and ADD 1 to DAY_OF_MONTH ?
  • 0
    @iturki: «Я использовал add not set». - Я сделал ту же ошибку, думая, что вы использовали set() . «если это так, я должен…» - да, для полуночи это должно сработать, чтобы дать вам завтрашнюю полночь.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню