Wi-Fi широковещательный приемник с несколькими намерениями

Я разработал приложение, использующее широковещательный приемник Wi-Fi. Мое требование - получить вызов функции, когда Wi-Fi подключен к маршрутизатору, получив IP-адрес, а также вызвать другую функцию, когда Wi-Fi отключен от ранее подключенного маршрутизатора.

Я использовал это в манифесте

<action android:name="android.net.wifi.STATE_CHANGE" />

для регистрации широковещательного приемника.

и в классе Broadcast Receiver в OnReceive :

NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
NetworkInfo.State state = networkInfo.getState(); 

if (state == NetworkInfo.State.CONNECTED) {

    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wi = wifiManager.getConnectionInfo();

    Log.e("++++WiFi Conected","++++WiFi Conected");

    Flags.wifiState = true;
    updateWifiSyncTrue(context);

    if (wi.getIpAddress() != 0) {
        intent = new Intent(context, ConnectionService.class);
        intent.putExtra("intentValue", "signalOn");
        intent.putExtra("bssId", wi.getBSSID());
        context.startService(intent);
    }
}

if (state == NetworkInfo.State.DISCONNECTED) {
    Log.e("++++WiFi DisConected","++++WiFi DisConnected");
    Flags.wifiState = false;
    updateWifiSyncFalse(context);
    updateRouterSyncFalse(context);

    intent = new Intent(context, ConnectionService.class);
    intent.putExtra("intentValue", "signalOff");
    context.startService(intent);
}

Все работало до KitKat Но когда я проверял это с версией леденца, On Receive вызывал много раз.

Когда я включаю Wi-Fi, в результате отображается Состояние: Неактивен --Подключение-- Аутентификация -- Проверка захвата -- Подключено -- Подключено . Иногда также отключается.

при выключении. Подключен -- Отключен -- Отключен -- Отключен -- Отключен

Результат отладки NetworkInfo выглядит следующим образом:

[type: WIFI[], state: CONNECTING/CONNECTING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/AUTHENTICATING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/AUTHENTICATING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/CONNECTING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/OBTAINING_IPADDR, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

[type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "DJ     Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false].

Убедительно прошу помочь мне в том же. Используя мой код, когда Wi-Fi включен, состояние CONNECTED выполняется несколько раз, а также состояние DISCONNECTED.

И когда WIFI выключен, генерируется состояние Connected, а затем 4-5 Disconnected State.

Я использовал телефон HTC для тестирования.

Я использовал простое кодирование. Должен ли я получить более глубокую проверку условий для этого? (Подробное состояние и т.д...)

Каков наилучший способ справиться с этим решением?


person Ankit Jayaprakash    schedule 01.11.2016    source источник
comment
Спасибо за правку и исправления   -  person Ankit Jayaprakash    schedule 02.11.2016


Ответы (1)


Каждый раз, когда вы используете фильтр намерений android.net.wifi.STATE_CHANGE, он будет запускать широковещательный приемник несколько раз. Например, если вы включаете Wi-Fi, то onreceive трансляции будет звонить несколько раз от 1 до 5 раз. Таким образом, это даст вам несколько NetworkInfo.State.CONNECTED и то же самое с отключенным.

Поэтому, если вы хотите, чтобы только один подключенный или отключенный вывод, это означает, что просто используйте логический флаг и установите его правильно таким образом, что сначала, если Wi-Fi включен, это означает, что он должен игнорировать оставшиеся намерения подключения к Wi-Fi и, аналогично, Wi-Fi отключен.

person Sivateja.koppineedi    schedule 29.12.2016