Android AppWidgets (ホーム画面ウィジェット) が LocalBroadcastManager を介してローカル アプリケーション ブロードキャストを受信していないようです (間違っていたら訂正してください)。したがって、ウィジェットと通信するには、通常のシステム全体のブロードキャストを使用する必要があります。
AppWidgetProvider
は、最初に追加されたときにアプリ ウィジェットのコンテンツを入力するなど、システムから送信されたブロードキャストに応答する必要があります ( ) ACTION_APPWIDGET_UPDATE
。
ただし、コード ( 以外) は、および のようなメソッドをAppWidgetProvider
使用して、いつでもアプリ ウィジェットの UI に更新をプッシュできます。これらの更新をプッシュするときのトリガーはあなた次第であり、(または Otto や他のメッセージ バスの実装) が役割を果たす可能性があると考えられます。AppWidgetManager
updateAppWidget()
LocalBroadcastManager
多くの情報源から、効率とセキュリティのために、ローカル ブロードキャストのみを使用することが推奨されています。
アプリ ウィジェットは本来、効率的でも安全でもありません。効率が必要な場合は、アプリ ウィジェットを頻繁に更新しないようにしてください。セキュリティが必要な場合は、アプリ ウィジェットを実装しないでください。
「多くの情報源」は、主にアプリのコンポーネント間の通信のためのブロードキャストの送信者であり、受信者である場合に、一般的なアドバイスを提供しています。ローカル ブロードキャストはプロセス間通信には役に立たず、アプリ ウィジェットはプロセス間通信に基づいています。プロセスは、OS システム プロセスを介してホーム画面プロセスと通信し、変更内容をホーム画面に反映します。
IOW、「多くの情報源」が食べる量を減らすように言っているからといって、完全に食べるのをやめないでください。通常、問題が発生するからです. :-)
グローバルブロードキャストの使用を最小限に抑えながら、ウィジェットと通信する良い方法を見つけようとしています。
「ウィジェットと通信」しません。せいぜい、あなたはあなたと「コミュニケーション」するかもしれませんAppWidgetProvider
。アプリ ウィジェット自体は、ホーム画面によってレンダリングされる一連のピクセルです。
システム ブロードキャスト (「グローバル ブロードキャスト」) を取り除くことはできません。これは、OS が好むと好まざるとにかかわらずシステム ブロードキャストを送信するためであり、アプリ ウィジェットを機能させるために必要です。
私の現在の計画は、すべてのメッセージを単一のメッセージ「WIDGET_NEEDS_UPDATE」に最小化することです。
オペレーティング システムにはこのブロードキャストの概念がなく、AppWidgetProvider
好むと好まざるとにかかわらず標準のブロードキャストを送信するため、Android オペレーティング システムを書き直す必要があります。繰り返しますが、これらのシステム ブロードキャストが必要です。そうしないと、アプリ ウィジェットを画面に追加できません。
これは基本的にウィジェットを「突っ込み」、更新情報を探すように指示します。
経由でアプリ ウィジェットの UI を更新するだけの方が効率的ですAppWidgetManager
。
これは合理的に思えますか?
セキュリティや効率性を明らかに向上させているわけではありません。
まだ確信が持てないことの 1 つは、静的メンバーのライフサイクルです。アプリケーション アクティビティまたはサービスが実行されている限り、これらの静的メンバーにアクセスできることが保証されますか?
いいえ。静的データ メンバーは、プロセスが終了するまで存続します。これは、フォアグラウンドではなくなったプロセスに対していつでも発生する可能性があります。