Обновление виджета Android не работает - PullRequest
0 голосов
/ 21 июля 2011

Мой виджет должен обновлять свои текстовые просмотры каждый день в 0:00. В widget_provider.xml я установил android: updatePeriodMillis = "1000", но я прочитал, что минимальный период обновления составляет 30 минут, и я должен использовать alarmManager для этого. Поэтому я хочу сигнал тревоги, который запускает обновление каждый день в 0:00. UpdateService.class обрабатывает обновление (устанавливает тексты для текстовых представлений на основе даты. Класс не вызывается примерно через полчаса после полуночи)

В методе public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) я использую этот код:

 Intent intentN = new Intent(context, UpdateService.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentN, PendingIntent.FLAG_UPDATE_CURRENT);
 Calendar calendarN = Calendar.getInstance();
 calendarN.setTimeInMillis(System.currentTimeMillis());
 calendarN.add(Calendar.HOUR_OF_DAY, 20);
 calendarN.add(Calendar.MINUTE, 44);
 calendarN.add(Calendar.SECOND, 5);
 AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarN.getTimeInMillis(), 7000, pendingIntent);

(сейчас пытаюсь узнать фактическое время)

Это правильное место для этого кода? Почему это не работает? Я использую тост-сообщения в UpdateService.java, но я никогда не получаю тост в методе onStart(Intent intent, int startId), кроме первого раза, когда приложение установлено.

Заранее спасибо

Обновление

С помощью, вероятно, kevin, я переписываю код. Я попробовал этот код в Activity, и он работает:

   Intent myIntent = new Intent(MainActivity.this, UpdateService.class);
        PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, myIntent, 0);

                 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                 alarmManager.cancel(pendingIntent);
                 Calendar calendar = Calendar.getInstance();
                 calendar.setTimeInMillis(System.currentTimeMillis());
                 calendar.add(Calendar.SECOND, 10);
                 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 8000, pendingIntent);
        Toast.makeText(MainActivity.this, "Start Alarm", Toast.LENGTH_LONG).show();

Однако, если я изменю его для класса AppWidgetProvider (и положу его туда), он не будет работать. Я никогда не получаю тост сообщения:

 Intent myIntent = new Intent(context, UpdateService.class);
         PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

                  AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
                  alarmManager.cancel(pendingIntent);
                  Calendar calendar2 = Calendar.getInstance();
                  calendar2.setTimeInMillis(System.currentTimeMillis());
                  calendar2.add(Calendar.SECOND, 10);
                  alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), 8000, pendingIntent);
         Toast.makeText(context, "Start Alarm", Toast.LENGTH_LONG).show();

1 Ответ

0 голосов
/ 21 июля 2011

Во-первых, ваше время повторения должно быть 24 * 60 * 60 * 1000, как в миллисекундах.Во-вторых, ваше время начала можно найти, используя оставшееся время до следующего 0: 00:

final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000;
long timeUntilMidnight = MILLIS_IN_DAY - (System.currentTimeMillis() % MILLIS_IN_DAY);

Затем установите будильник, добавив время, оставшееся к текущему времени:

alarmManager.setRepeating(...System.currentTimeMillis() + timeUntilMidnight, MILLIS_IN_DAY...);

Убедитесь, что вы не установили несколько одинаковых будильников.Мне нравится звонить

alarmManager.cancel(pendingIntent);

, прежде чем устанавливать его снова, чтобы быть уверенным.

...