web-dev-qa-db-ja.com

フラグメントの動的放送受信機

ブロードキャストレシーバーをフラグメントに動的に登録して、接続状態の変化をリッスンすることは可能ですか?もしそうなら、どのように?そうでない場合、フラグメントのいくつかの回避策は何ですか?

編集:BroadcastReceiverを登録するには、コンテキストが必要です。フラグメントはアクティビティ内に存在するため、コンテキストを取得するためのおそらく最良の方法は、getActivity()を使用することです。ただし、gnorsilvaが以下で説明するように、注意すべき特定の特殊なケースがあります。

22
Theo

user853583の提案は良い提案ですが、フラグメント内のコンテキストにアクセスする必要がある場合は、getActivity().getApplicationContext()を使用する必要があります。

可能な限り、アクティビティをコンテキストとして渡すことは避けてください。メモリリークが発生する可能性があります。一部のオブジェクトは、onDestroy()が呼び出された後もそのアクティビティを保持し、ガベージコレクションされません。

そうは言っても、アクティビティをコンテキストとして渡す必要がある場合があります-例:リストアダプタの場合

ただし、さらに2つのことがあります。

  • フラグメントはアクティビティにアタッチおよびデタッチされるため、getActivity()がnullを返す場合があります。アクティビティが生きていることがわかっている特定のライフサイクルメソッド内で安全に呼び出すことができます。例:onResume()

  • フラグメントがインスタンスを保持しない場合、つまり方向の変更時に破棄される場合は、必ずフラグメント内のレシーバーの登録を解除してください。たとえば、onPause()またはonDestroy()内などです。

30
gnorsilva

私が見る限り、BroadcastReceiverをフラグメントに登録する方法はありません。その放送受信機は何のために必要ですか?良い解決策は言及されたものです ここ

3
user853583

次のようにブロードキャストレシーバーを登録できます:getActivity()。registerReceiver(.。

1
Ano