4

タイトルが示すように、BroadcastReceiver onReceive()メソッドを非同期で実行する方法はありますか?

その実装に基づいて、androidonReceive()はメイン スレッドでメソッドを実行します。

を使用しBroadcastReceiverて、USB デバイスと通信する許可を明示的に要求しています。パーミッションの要求ダイアログ ボックスがパーミッションを受け取ると、onReceive()メソッドが呼び出されますが、メソッドはメイン スレッドで実行されるため、完了したときに通知する方法はありません (少なくとも、私が知っていることではありません)。ブール値フラグをポーリングすると、メイン スレッドがブロックされ、onReceive()メソッドの呼び出しがブロックされます。

非同期呼び出しを行う方法onReceive()はありますか、または明示的に (マニフェストでインテント フィルターを使用せずに) 許可を要求して USB デバイスに接続する別の方法はありますか?

編集:許可が取得され、接続が確立されるまでメソッドがブロックされるようにしたいと思います。

4

3 に答える 3

1

ブロードキャスト レシーバの onReceive でブロードキャストを送信できます。ブロードキャスト インテントは、Activity のライフサイクル メソッドに登録でき、同じ方法で登録解除できます。

于 2013-10-02T15:02:19.920 に答える
1

まず第一に、メインスレッドでブロックするようなことはすべきではありません。第二に、使用しない限り 、10 秒後に強制終了される可能性が高いため、registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)時間がかかることは絶対に行わないでください ( BroadcastReceiver のドキュメントを参照してください)。メソッドから 1 つまたは別のスレッドを開始する必要があります。USB デバイスが接続されるまで残りの UI との対話を停止する場合は、メイン スレッドをブロックせずに停止します。物事を明示的に無効にするか、読み込み中の GIF またはブロック以外のものを使用して単純なフラグメントまたはアクティビティに切り替えます。メイン スレッドでブロックすると、待機または強制終了システム ダイアログがポップアップし、ユーザーが待機を選択することはありません。BroadcastReceiver.onReceiveAsyncTaskonReceive

あなたの質問に対する簡単な答えはregisterReceiver、マニフェストを使用する代わりにプログラムで受信者を登録することですが、最初にいくつかの免責事項を提供する必要がありました。

于 2013-10-02T15:41:37.883 に答える