Android の設計についていくつか質問がありBroadcastReceiver
ます。
私のシナリオは次のとおりです。特定の Wi-Fi ネットワークが接続されている場合、キャプティブ ポータルがあるかどうかを検出し、ある場合はそれを認証します。このシナリオにはネットワーク I/O が含まれており、完了までに数秒かかります (特に、パスワードが記載された SMS を待つ必要がある場合)。
Wifi 状態の変更をデバッグするBroadcastReceiver
と、アプリケーションのメイン スレッドで呼び出されることがわかりました。これは、数分前から私が知らなかったものでした。質問は私の発見の結果でもあるので、私はこれを言っています。
ワイヤレス認証フェーズ中に、ユーザーが突然切断された場合 (たとえば、ホットスポットの障害、ユーザーが範囲外に出たことなど) に対処し、2 つのブロードキャストが重複して最終的に失敗する可能性がある認証をキャンセルすることを回避することで、再接続する必要があります。 .
BroadcastReceiver がメイン スレッドで実行されることを発見した後、ネットワーク I/O を実行するには が必要であるという結論に達しましたが、AsyncTask
他のアイデアを自由に提案してください。
問題は、長時間実行タスクの途中で連続ブロードキャストが発生した場合、どうすればそれを停止できるかということです。確かにs はキャンセルできますが、生活をあまり複雑にすることなく別の BroadcastReceiver からキャンセルするためにAsyncTask
、 の共有インスタンスを保存するにはどうすればよいでしょうか?AsyncTask
BroadcastReceiver
Android は事実上のシングルトンですか、それとも Android は、新しいブロードキャストを起動する必要があるたびに、宣言されたレシーバーの新しいインスタンスを作成しますか?