NetworkInfo无法正确响应运行Nougat的手机上的网络更改

the*_*lar 5 java android background-process networkinfo

前言:在运行6.0.1的手机上运行正常.但是在运行7.1.1的手机上,它不是,如下所示.

build.gradle(模块:app)

compileSdkVersion 25
buildToolsVersion "25.0.0"
applicationId "com.gesslar.threshvote"
minSdkVersion 19
targetSdkVersion 25
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

从WiFi和数据连接开始我已完成以下测试 关闭WiFi

03-08 20:15:04.664 29796-29796/com.gesslar.threshvote D/NetworkUtil: NO CONNECTION INFORMATION
Run Code Online (Sandbox Code Playgroud)

打开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
Run Code Online (Sandbox Code Playgroud)

关闭数据:

No log line written
Run Code Online (Sandbox Code Playgroud)

打开数据:

No log line written
Run Code Online (Sandbox Code Playgroud)

关闭WiFi然后关闭数据:

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

关闭两个,打开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.
Run Code Online (Sandbox Code Playgroud)

我对结果感到非常困惑.我在其他地方看到我应该在运行时绑定它,但是,我唯一的活动是Preferences活动.该应用程序不具有运行时UI,而是使用后台IntentService和Notifications.

Shr*_*yak 4

根据安卓文档

如果面向 Android 7.0(API 级别 24)及更高版本的应用在清单中声明了广播接收器,则它们不会收到 CONNECTIVITY_ACTION 广播。如果应用程序使用 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则应用程序仍将收到 CONNECTIVITY_ACTION 广播。

所以你需要做的是启动一个Service,创建一个广播接收器的新实例NetworkChangeReceiver并注册它以android.net.conn.CONNECTIVITY_CHANGE通过使用来监听它

registerReceiver(new NetworkChangeReceiver(), new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))
Run Code Online (Sandbox Code Playgroud)

  • 我来自[这个](http://stackoverflow.com/q/42739403/4095334)问题。您不需要“JobService”或任何特定的东西。只要“服务”就可以了。 (2认同)