Как обновить виджет приложения в полночь? - PullRequest
7 голосов
/ 06 января 2012

Мое приложение имеет виджет, который показывает сегодняшнюю дату и должен быть обновлен в полночь. Виджет определяется в манифесте как

<manifest>
    ...
    <application>
        ...
        <receiver
            android:name=".MyWidgetProviderClass"
            android:label="MyLabel" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_icon_info" />
        </receiver>
    </application>
</manifest>

И файл информации о виджете

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/my_layout"
    android:minHeight="40dp"
    android:minWidth="294dp"
    android:updatePeriodMillis="3600000" >
</appwidget-provider>

Это приводит к тому, что виджет обновляется в любое время с полуночи до 13:00, но я хочу, чтобы обновление было ближе к полуночи, поэтому я добавил в приложение намеренный получатель

<receiver
     android:name=".MyWidgetUpdaterClass"
     android:enabled="true" >
     <intent-filter>
         <action android:name="MyAction" />
      </intent-filter>
</receiver>

и статический метод

public static void setMidngintAlarms(Context context) {
    Intent intent = new Intent("MyAction");
    PendingIntent pendingIntent = 
        PendingIntent.getBroadcast(context, 0, intent, 0);              
    long interval = 24*60*60*1000;        
    long firstTime = SystemClock.elapsedRealtime() + 
        millisecondsToNextMidnight();
    AlarmManager am = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    firstTime, interval, pendingIntent);
}

(поскольку диспетчер тревог запрашивает с одинаковым намерением перезаписывать друг друга, при вызове setMidngintAlarms не повредит несколько раз).

Я пытался вызвать setMidnightAlarms () из нескольких мест (из основной активности приложения, из onUpdate () AppWidgetProvider и т. Д.). Все работает хорошо, намерения менеджера аварийных сигналов получены, и виджет обновляется, но только до тех пор, пока приложение работает. Если я убил приложение, виджеты перестают обновляться в полночь.

Есть идеи, как заставить виджеты обновляться в полночь? Нужно ли добавлять услугу? Если так, то как? Любой пример?

Я немного удивлен, насколько нетривиально заставить эту базовую функциональность работать.

Ответы [ 2 ]

0 голосов
/ 10 августа 2017

добавьте это в ваш получатель виджета манифеста

 <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            <action android:name="android.intent.action.DATE_CHANGED" />...

изменение даты вызовет срабатывание onReceive () с действием "android.intent.action.DATE_CHANGED"

0 голосов
/ 10 августа 2012

Я решаю эту проблему следующим образом:

  1. Запустите службу для прослушивания сообщения Intent.ACTION_TIME_TICK. Затем отправьте трансляцию на виджет, если время отмечено. (Каждую минуту).

  2. Получите трансляцию в виджете и оцените погоду за полночь:

Код:

   if (MyWidget.BROADCAST_TIME_TICK.equals(action)) {
        //If it's midnight, then update.
        int hour = Calendar.getInstance().get(Calendar.HOUR);
        int minute = Calendar.getInstance().get(Calendar.MINUTE);
        Utils.log(TAG, "time is : " + hour+":" + minute);
        if (!(hour == 0 && minute == 0)) {  //Only update at midnight's time tick.
            return;
        } else {
            //Do the midnight stuff.
        }
    }
...