7

私のアプリには、今日の日付を表示するウィジェットがあり、午前 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() などから)。すべてが正常に機能し、アラーム マネージャーのインテントが受信され、ウィジェットが更新されますが、アプリが実行されている間だけです。アプリを強制終了すると、ウィジェットは深夜に更新を停止します。

真夜中にウィジェットを更新する方法はありますか? サービスを追加する必要がありますか? もしそうなら、どのように?例はありますか?

この基本的な機能を機能させることがいかに簡単ではないかということに少し驚いています。

4

2 に答える 2

0

私はこの問題を次のように解決します:

  1. Intent.ACTION_TIME_TICKメッセージをリッスンするサービスを開始します。次に、Time TICKEDの場合、ブロードキャストをウィジェットに送信します。(毎分)。

  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.
        }
    }
于 2012-08-10T08:51:47.733 に答える