あなたが説明したようにこれを実際に行うことはできません。@CommonsWareは正しく、選択したアーキテクチャに欠陥があります。
BroadcastReceiver
は短命です。したがって、非同期呼び出しを行うことはできず、「かなりの時間」かかるタスクを実行することもできません。特定のイベントによってトリガーBroadcastReceiver
され、そのイベントのためにかなりの量の作業を行う必要がある場合は、その作業をに委任する必要がありますService
。
通常(例:内Activity
)、から情報を要求するService
場合は、にバインドしService
てサービスに同期呼び出しを行い、必要なデータを要求するか、サービスを非同期に呼び出すことができます(つまりIntent
、 it)次に、返された結果をリッスンします(を使用してBroadcastReceiver
)。はにバインドできず、非同期呼び出しを行うことができないBroadcastReceiver
ため、これらのメソッドはどちらもaからは機能しません。BroadcastReceiver
Service
編集:ここで参照するためにAndroidドキュメントから関連情報をコピーしました
レシーバーのライフサイクル
オブジェクトは、へのBroadcastReceiver
呼び出しの間のみ有効ですonReceive(Context, Intent)
。コードがこの関数から戻ると、システムはオブジェクトが終了し、アクティブでなくなったと見なします。
これは、実装で実行できることに重要な影響を及ぼします
onReceive(Context, Intent)
。非同期操作を処理するために関数から戻る必要があるため、非同期操作を必要とするものは利用できませんが、その時点でBroadcastReceiver
はアクティブではなくなり、システムはアクティブではなくなります。非同期操作が完了する前に、プロセスを自由に強制終了できます。
特に、ダイアログを表示したり、内からサービスにバインドしたりすることはできませんBroadcastReceiver
。前者の場合、代わりに
NotificationManager
APIを使用する必要があります。後者の場合、を使用
Context.startService()
してコマンドをサービスに送信できます。