Мое приложение имеет виджет, который показывает сегодняшнюю дату и должен быть обновлен в полночь. Виджет определяется в манифесте как
<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 и т. Д.). Все работает хорошо, намерения менеджера аварийных сигналов получены, и виджет обновляется, но только до тех пор, пока приложение работает. Если я убил приложение, виджеты перестают обновляться в полночь.
Есть идеи, как заставить виджеты обновляться в полночь? Нужно ли добавлять услугу? Если так, то как? Любой пример?
Я немного удивлен, насколько нетривиально заставить эту базовую функциональность работать.