ホーム画面に表示するシンプルなウィジェットを実装しようとしています。私が経験している問題は、ウィジェットをインストールするときにonUpdateが一度しか呼び出されないことです。構成は以下のとおりです。注:更新期間を20秒のままにすることはありません。これは、バッテリーを強制終了することを知っているためです(テストのみ)。
構成:
<appwidget-provider xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:minWidth="294dp"
Android:minHeight="72dp"
Android:updatePeriodMillis="20000"
Android:initialLayout="@layout/my_custom_app_widget">`
</appwidget-provider>`
マニフェストの抜粋:
<receiver Android:name="MyCustomWidgetProvider">
<intent-filter>
<action Android:name="Android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data Android:name="Android.appwidget.provider"
Android:resource="@xml/my_custom_app_widget_info" />
</receiver>
ウィジェットをインストールすると、次の動作が観察されます。私のWidgetProviderクラスで、onReceiveが呼び出され、次にonEnabled、onReceive、次にonUpdateが呼び出されます。
その後、ウィジェットが表示され、onUpdateが再び呼び出されることはありません。また、onUpdateが呼び出され、上記のXMLで設定されたすべて(更新期間など)が正しい場合は、プロバイダーの設定も検査します。
Android:updatePeriodMillis
20秒に設定されています。実際の最小時間は30分です。したがって、テスト中に更新があるかどうかを確認するために30分間待っていなかった場合は、もう少し待つ必要があります。
SDKから:
注:(updatePeriodMillis
で定義されている)更新の時間にデバイスがスリープ状態の場合、デバイスは更新を実行するためにウェイクアップします。 1時間に1回以上更新しない場合、これはおそらくバッテリ寿命に重大な問題を引き起こしません。
ただし、より頻繁に更新する必要がある場合や、デバイスがスリープ状態のときに更新する必要がない場合は、代わりに、デバイスをウェイクしないアラームに基づいて更新を実行できます。
そのためには、AppWidgetProvider
を使用して、AlarmManager
が受け取るインテントでアラームを設定します。アラームタイプをELAPSED_REALTIME
またはRTC
に設定します。これにより、デバイスが起動しているときにのみアラームが配信されます。次に、updatePeriodMillis
をzero
( "0")に設定します。
そしてSDK 1.6+の場合:
注:updatePeriodMillis
でリクエストされた更新は、30分に1回以上配信されません。
duduliが言ったように...ウィジェットクラスにインテントを送信するためにalarmManagerを使用すると、それを行う方法がわからない場合は、onReceiveメソッドでインテントを受け取ります このガイド 。それは私と他の人のために働いた