Android.net.wifi.STATE_CHANGE: не запускается при отключении Wi-Fi

Нормально ли иметь трансляцию с действием NETWORK_STATE_CHANGED_ACTION (чье постоянное значение android.net.wifi.STATE_CHANGE), когда соединение Wifi возвращается? То есть Я не понимаю, когда Wi-Fi отключается.

ОБНОВЛЕНИЕ: Меня больше всего интересует >= 2.2 Froyo

Ответ 1

public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION

Поскольку: Уровень API 1

Трансляция действие, указывающее, что соединение с проситель установлен (и теперь можно выполнить Wi-Fi) или подключение к проситель был потерян. Один extra обеспечивает состояние соединения как boolean, где true означает CONNECTED.

См. также

EXTRA_SUPPLICANT_CONNECTED

Постоянное значение: "android.net.wifi.supplicant.CONNECTION_CHANGE"

В android API говорится, что не рекомендуется проверять STATE_CHANGE для сетевого подключения, и вместо этого вы должны использовать SUPPLICANT_CONNECTION_CHANGE_ACTION. это увидит создание Wi-Fi-сети и разъединение сети Wi-Fi. Я не знаю, поможет ли это вам, но я надеюсь на это. ССЫЛКА

Ответ 2

У меня была аналогичная потребность в моем проекте, и мне пришлось использовать оба.

Действие android.net.wifi.supplicant.CONNECTION_CHANGE отправляет широковещательную рассылку, когда сеть подключена, но обычно до того, как устройство имеет IP-адрес, поэтому мне понадобилось действие android.net.wifi.STATE_CHANGE для этого.

Действие android.net.wifi.STATE_CHANGE получает широковещательную рассылку при отключении только в том случае, если устройство отключается от сети, но Wi-Fi все еще включен (когда точка доступа выходит за пределы диапазона, например)

Итак, вы должны поместить оба действия для получателя в манифест:

<receiver android:name="net.moronigranja.tproxy.WifiReceiver">
            <intent-filter>
                    <action android:name="android.net.wifi.STATE_CHANGE"/>
                    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
            </intent-filter>
</receiver>

и вы установите if, чтобы проверить, какое действие вызывается в намерении. Вот метод onReceive BroadcastReceiver в моем коде:

public void onReceive(Context c, Intent intent) {
      if(intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){ 
          boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
          if(!connected) {
               //Start service for disconnected state here
          }
      }

      else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
          NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
          if( netInfo.isConnected() )
          {
              //Start service for connected state here.
          }   
      }
  }