Подтвердить что ты не робот

Широковещательный приемник вызывает два вызова

Попытка проверить подключение к Интернету в моем приложении. Существует код моего манифеста:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <receiver android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

И есть класс handle:

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"));
    {
        Log.d("myLogs", "Network connectivity change");
        if (intent.getExtras() != null) {
            NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
                    ConnectivityManager.EXTRA_NETWORK_INFO);
            if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
                Log.i("myLogs", "Network " + ni.getTypeName() + " connected");
            }
        }
        if (intent.getExtras().getBoolean(
                ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
            Log.d("myLogs", "There no network connectivity");
        }
    }
}

}

В моем Logcat я получаю изображение как:

04-11 23:24:48.021: D/myLogs(10261): Network connectivity change
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected

Итак, получатель дважды звонил. Зачем? Существует некоторая проблема со всеми типами соединений.

4b9b3361

Ответ 1

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

Чтобы узнать, что сообщение было вызвано, вы можете иметь статическое логическое значение, которое переключается между подключением и отключением и вызывает вызовы подпрограмм при получении соединения, а логическое значение - true. Что-то вроде:

public class ConnectionChangeReceiver extends BroadcastReceiver {
    private static boolean firstConnect = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null) {
            if(firstConnect) { 
                // do subroutines here
                firstConnect = false;
            }
        }
        else {
            firstConnect= true;
        }
    }
}

Примечание

Есть две вещи, которые вам нужно наблюдать. Сначала - где-то хранят "firstConnect", например, в общих предпочтениях, а во-вторых, когда вы переходите с 3G на Wi-Fi, нет никакого фактического отключения, поэтому лучше обрабатывать события 3G и WiFi отдельно

Ответ 2

Вам также может потребоваться проверить, является ли полученное намерение одним из важных событий, проверив isStickyBroadcast в вашем приемнике. Если это так, вы можете игнорировать его и продолжать. Вы получаете липкие трансляции, как только регистрируется получатель.

http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29

Ответ 3

Объяснено в документах:

" Изменения в подключении устройства могут быть очень частыми.. Эта трансляция запускается каждый раз, когда вы перемещаетесь между мобильными данными и Wi-Fi. В результате это хорошая практика для мониторинга этого когда вы ранее приостанавливали обновления или закачки, чтобы возобновить их. Обычно достаточно просто проверить подключение к Интернету перед началом обновления и, если не будет, приостановите дальнейшие обновления до восстановления связи."

Изменить: Забыл добавить... широковещательный приемник только для того, чтобы узнать, подключено ли устройство, немного в форме hoverhead. Из тех же документов:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;