web-dev-qa-db-ja.com

Androidウィジェットが更新されない

ホーム画面に表示するシンプルなウィジェットを実装しようとしています。私が経験している問題は、ウィジェットをインストールするときに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で設定されたすべて(更新期間など)が正しい場合は、プロバイダーの設定も検査します。

38
phogel

Android:updatePeriodMillis 20秒に設定されています。実際の最小時間は30分です。したがって、テスト中に更新があるかどうかを確認するために30分間待っていなかった場合は、もう少し待つ必要があります。

68
CommonsWare

SDKから:

注:updatePeriodMillisで定義されている)更新の時間にデバイスがスリープ状態の場合、デバイスは更新を実行するためにウェイクアップします。 1時間に1回以上更新しない場合、これはおそらくバッテリ寿命に重大な問題を引き起こしません。

ただし、より頻繁に更新する必要がある場合や、デバイスがスリープ状態のときに更新する必要がない場合は、代わりに、デバイスをウェイクしないアラームに基づいて更新を実行できます。

そのためには、AppWidgetProviderを使用して、AlarmManagerが受け取るインテントでアラームを設定します。アラームタイプをELAPSED_REALTIMEまたはRTCに設定します。これにより、デバイスが起動しているときにのみアラームが配信されます。次に、updatePeriodMilliszero( "0")に設定します。

そしてSDK 1.6+の場合:

注:updatePeriodMillisでリクエストされた更新は、30分に1回以上配信されません。

20
duduli

duduliが言ったように...ウィジェットクラスにインテントを送信するためにalarmManagerを使用すると、それを行う方法がわからない場合は、onReceiveメソッドでインテントを受け取ります このガイド 。それは私と他の人のために働いた

1
Saul_programa