私のアプリには、今日の日付を表示するウィジェットがあり、午前 0 時に更新する必要があります。ウィジェットはマニフェストで次のように定義されています。
<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>
これにより、ウィジェットは真夜中から午後 1 時の間いつでも更新されますが、真夜中近くに更新したいので、インテント レシーバーをアプリに追加しました
<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() を呼び出してみました (アプリのメイン アクティビティから、AppWidgetProvider の onUpdate() などから)。すべてが正常に機能し、アラーム マネージャーのインテントが受信され、ウィジェットが更新されますが、アプリが実行されている間だけです。アプリを強制終了すると、ウィジェットは深夜に更新を停止します。
真夜中にウィジェットを更新する方法はありますか? サービスを追加する必要がありますか? もしそうなら、どのように?例はありますか?
この基本的な機能を機能させることがいかに簡単ではないかということに少し驚いています。