BroadcastReceiver を使用して、電話が WiFi アクセス ポイントから切断されたことを検出しようとしています。これを行うために、BroadcastReceiver をマニフェストに登録しました。
<receiver android:name="com.eshayne.android.WiFiBroadcastReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
私の WiFiBroadcastReceiver クラスでは、NETWORK_STATE_CHANGED_ACTION アクションをチェックし、NetworkInfo の詳細な状態を調べています。
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo info = (NetworkInfo)intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
android.util.Log.d("com.eshayne.android.WiFiBroadcastReceiver", "network state change - detailedState=" + info.getDetailedState() + ": " + info.toString());
if (info.getDetailedState() == DetailedState.DISCONNECTED) {
...
}
else if (info.getDetailedState() == DetailedState.CONNECTED) {
...
}
私が見ている問題は、電話がWiFiアクセスポイントの範囲を離れると、「切断された」コールバックが停止する前に6回(かなり定期的に15秒ごとに約1回)呼び出されることです。これまでのところ、各コールバックの NetworkInfo の間で際立った特徴を見つけることができませんでした。ログに書き込まれる各 NetworkInfo オブジェクトは次のようになります。
02-18 10:16:51.918 D/com.eshayne.android.WiFiBroadcastReceiver( 1511): network state change - detailedState=DISCONNECTED: NetworkInfo: type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
また、「接続された」コールバックは「切断された」コールバックの間に呼び出されないため、電話が WiFi の範囲内外をさまよっているという問題でもありません。また、その間に他の状態がトリガーされることもありません。それぞれが DISCONNECTED の detailedState を持つ 6 つのコールバックの急速なシリーズです。
電話が WiFi 接続を失ったことを検出して、コールバックが切断ごとに 1 回だけ呼び出されるようにするためのより良い方法はありますか? または、私が見ている6つのコールバックのどれが「最終」のものであるかを検出する方法はありますか?