NetworkInfo неправильно реагирует на изменения сети на телефоне под управлением Nougat

Предисловие: Это прекрасно работает на телефоне с 6.0.1. но на моем телефоне, который работает 7.1.1, это не так, как показано ниже.

build.gradle (Модуль: приложение)

compileSdkVersion 25
buildToolsVersion "25.0.0"
applicationId "com.gesslar.threshvote"
minSdkVersion 19
targetSdkVersion 25

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <receiver
        android:name=".NetworkChangeReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

NetworkUtil.java У меня есть BroadcastReceiver, который я использую для простого вызова NetworkUtil.updateNetworkStatus(context);

public static void updateNetworkStatus(Context context) {
    final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
    if (activeNetwork == null) {
        Log.d(TAG, "NO CONNECTION INFORMATION");
        return;
    }
    if (activeNetwork.isConnected()) {
        Log.d(TAG, "WE ARE CONNECTED TO A NETWORK");
    } else {
        Log.d(TAG, "WE ARE NOT CONNECTED TO A NETWORK");
        return;
    }
    Log.d(TAG, "NETWORK TYPE: " + activeNetwork.getTypeName());
}

Начиная с WiFi и Data Connected, я выполнил следующие тесты.Выключите WiFi.

03-08 20:15:04.664 29796-29796/com.gesslar.threshvote D/NetworkUtil: NO CONNECTION INFORMATION

Включить WiFi:

03-08 20:15:26.333 29796-29796/com.gesslar.threshvote D/NetworkUtil: WE ARE CONNECTED TO A NETWORK
03-08 20:15:26.333 29796-29796/com.gesslar.threshvote D/NetworkUtil: NETWORK TYPE: MOBILE

Выключить данные:

No log line written

Включить данные:

No log line written

Выключите WiFi, а затем выключите данные:

1) 03-08 20:17:13.029 29796-29796/com.gesslar.threshvote D/NetworkUtil: NO CONNECTION INFORMATION
2) No log line written

Когда оба выключены, включите WiFi:

03-08 20:18:00.198 29796-29796/com.gesslar.threshvote D/NetworkUtil: NO CONNECTION INFORMATION
^ showed as soon as it started seeking for WiFi, but no further log line was written when WiFi became active.

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

1 ответ

Решение

Согласно документам на Android,

Приложения, ориентированные на Android 7.0 (уровень API 24) и выше, не получают широковещательные сообщения CONNECTIVITY_ACTION, если они декларируют широковещательный получатель в своем манифесте. Приложения по-прежнему будут получать широковещательные сообщения CONNECTIVITY_ACTION, если они зарегистрируют свой BroadcastReceiver с помощью Context.registerReceiver() и этот контекст будет по-прежнему действителен.

Итак, что вам нужно сделать, это начать Service создать новый экземпляр приемника Broadcast NetworkChangeReceiver и зарегистрируйте его, чтобы прослушать android.net.conn.CONNECTIVITY_CHANGE используя

registerReceiver(new NetworkChangeReceiver(), new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))
Другие вопросы по тегам