从 Nougat 和进一步的 android 版本检测网络变化的解决方法代码是什么 >
What is the workaround code to detect network changes from Nougat and further android versions >
我正在使用以下代码检测网络变化
public class NetworkStateListener extends BroadcastReceiver {
public static int NETWORK_CONNECTED_TYPE_WIFI = 1;
public static int NETWORK_CONNECTED_TYPE_MOBILE = 2;
public static int NO_NETWORK_CONNECTIVITY = 0;
public static int TYPE_NOT_KNOWN = -1;
private static final List<NetworkStateChangeListener> LISTENERS = new CopyOnWriteArrayList<>();
@Override
public void onReceive(Context context, Intent intent) {
int status = getConnectivityStatus(context, intent);
networkChecking(status);
}
private void networkChecking(int noNetworkConnectivity) {
for (NetworkStateChangeListener mlistener : LISTENERS) {
if (mlistener != null) {
mlistener.onNetworkStateChanged(noNetworkConnectivity);
}
}
}
public static void registerNetworkState(NetworkStateChangeListener listener) {
synchronized (LISTENERS) {
if (!LISTENERS.contains(listener)) {
LISTENERS.add(listener);
}
}
}
public static void unregisterNetworkState(NetworkStateChangeListener listener) {
LISTENERS.remove(listener);
}
public static int getConnectivityStatus(Context context, Intent intent) {
if (intent.getExtras() != null) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork!=null) {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI){
return NETWORK_CONNECTED_TYPE_WIFI;
}
if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE){
return NETWORK_CONNECTED_TYPE_MOBILE;
}
}
return NO_NETWORK_CONNECTIVITY;
}
return TYPE_NOT_KNOWN;
}
}
并在 AndroidManifest.xml
中初始化以下意图过滤器
<receiver android:name=".utils.network.NetworkStateListener">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
此代码适用于 6.0.1 以下的 Marshmallow 设备。但是从7牛轧糖开始就不行了
Nougat 中的代码更改是什么?
任何代码或要点将不胜感激。提前致谢。
找到解决方案:
像这样以编程方式注册
IntentFilter intentFilter = new IntentFilter();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // **For Nougat**
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
} else {
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_CHANGE));
}
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
我正在使用以下代码检测网络变化
public class NetworkStateListener extends BroadcastReceiver {
public static int NETWORK_CONNECTED_TYPE_WIFI = 1;
public static int NETWORK_CONNECTED_TYPE_MOBILE = 2;
public static int NO_NETWORK_CONNECTIVITY = 0;
public static int TYPE_NOT_KNOWN = -1;
private static final List<NetworkStateChangeListener> LISTENERS = new CopyOnWriteArrayList<>();
@Override
public void onReceive(Context context, Intent intent) {
int status = getConnectivityStatus(context, intent);
networkChecking(status);
}
private void networkChecking(int noNetworkConnectivity) {
for (NetworkStateChangeListener mlistener : LISTENERS) {
if (mlistener != null) {
mlistener.onNetworkStateChanged(noNetworkConnectivity);
}
}
}
public static void registerNetworkState(NetworkStateChangeListener listener) {
synchronized (LISTENERS) {
if (!LISTENERS.contains(listener)) {
LISTENERS.add(listener);
}
}
}
public static void unregisterNetworkState(NetworkStateChangeListener listener) {
LISTENERS.remove(listener);
}
public static int getConnectivityStatus(Context context, Intent intent) {
if (intent.getExtras() != null) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork!=null) {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI){
return NETWORK_CONNECTED_TYPE_WIFI;
}
if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE){
return NETWORK_CONNECTED_TYPE_MOBILE;
}
}
return NO_NETWORK_CONNECTIVITY;
}
return TYPE_NOT_KNOWN;
}
}
并在 AndroidManifest.xml
中初始化以下意图过滤器<receiver android:name=".utils.network.NetworkStateListener">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
此代码适用于 6.0.1 以下的 Marshmallow 设备。但是从7牛轧糖开始就不行了
Nougat 中的代码更改是什么?
任何代码或要点将不胜感激。提前致谢。
找到解决方案:
像这样以编程方式注册
IntentFilter intentFilter = new IntentFilter();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // **For Nougat**
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
} else {
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_CHANGE));
}
registerReceiver(new NetworkConnectionReceiver(), intentFilter);