Я пытаюсь использовать 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 секунд, - до того, как он останавливается.До сих пор я не смог найти никаких отличительных характеристик между 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, поскольку мой «подключенный» обратный вызов не вызывается между «отключенным»"обратные вызовы.Никаких других состояний не происходит между ними.Просто быстрая серия из 6 обратных вызовов, каждый с подробным состоянием ОТКЛЮЧЕНО.
Есть ли лучший способ для меня определить, когда телефон потерял соединение WiFi, чтобы мой обратный вызов вызывался только один раз за отключение?Или какой-нибудь способ определить, какой из 6 обратных вызовов, которые я вижу, является «последним»?