android.net.wifi.STATE_CHANGE: не срабатывает при отключении Wi-Fi - PullRequest
10 голосов
/ 20 марта 2011

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

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

Ответы [ 2 ]

24 голосов
/ 22 марта 2011

публичная статическая финальная строка SUPPLICANT_CONNECTION_CHANGE_ACTION

С: Уровень API 1

Цель трансляции действие, указывающее, что соединение с соискатель был установлен (и теперь можно выполнить Операции Wi-Fi) или подключение к соискатель был потерян. Один дополнительная обеспечивает состояние соединения как логическое значение, где true означает СОЕДИНЕННОЕ.

См. Также

EXTRA_SUPPLICANT_CONNECTED

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

В API Android написано, что не рекомендуется проверять STATE_CHANGE на наличие сетевых подключений, и вместо этого вам следует использовать SUPPLICANT_CONNECTION_CHANGE_ACTION. это заметит установление к сети Wi-Fi и отключение сети Wi-Fi. Я не знаю, может ли это помочь вам, но я надеюсь на это. LINK

21 голосов
/ 04 мая 2011

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

Действие 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.
          }   
      }
  }
...