NetworkInfo 未正确响应 phone 运行 Nougat 上的网络更改
NetworkInfo is not properly responding to network changes on phone running Nougat
前言:这在 phone 运行 6.0.1 上工作得很好。但是在我的 phone 上是 运行 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 和数据连接开始我做了以下测试
关闭 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.
我对结果感到非常困惑。我在其他地方看到我应该在运行时绑定它,但是,我唯一的 activity 是首选项 activity。该应用程序不打算拥有运行时 UI,而是使用后台 IntentService 和通知。
根据android docs,
Apps targeting Android 7.0 (API level 24) and higher do not receive
CONNECTIVITY_ACTION broadcasts if they declare the broadcast receiver
in their manifest. Apps will still receive CONNECTIVITY_ACTION
broadcasts if they register their BroadcastReceiver with
Context.registerReceiver() and that context is still valid.
所以你需要做的是启动一个 Service
,创建广播接收器的一个新实例 NetworkChangeReceiver
并使用 [=16] 注册它以收听 android.net.conn.CONNECTIVITY_CHANGE
=]
registerReceiver(new NetworkChangeReceiver(), new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))
前言:这在 phone 运行 6.0.1 上工作得很好。但是在我的 phone 上是 运行 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 和数据连接开始我做了以下测试 关闭 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.
我对结果感到非常困惑。我在其他地方看到我应该在运行时绑定它,但是,我唯一的 activity 是首选项 activity。该应用程序不打算拥有运行时 UI,而是使用后台 IntentService 和通知。
根据android docs,
Apps targeting Android 7.0 (API level 24) and higher do not receive CONNECTIVITY_ACTION broadcasts if they declare the broadcast receiver in their manifest. Apps will still receive CONNECTIVITY_ACTION broadcasts if they register their BroadcastReceiver with Context.registerReceiver() and that context is still valid.
所以你需要做的是启动一个 Service
,创建广播接收器的一个新实例 NetworkChangeReceiver
并使用 [=16] 注册它以收听 android.net.conn.CONNECTIVITY_CHANGE
=]
registerReceiver(new NetworkChangeReceiver(), new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))