转载 https://www.jianshu.com/p/66afbd05c9b9
以前监听网络变化都是使用的广播,现在换一种方式 ConnectivityManager.NetworkCallback
可以监听到 蜂窝网络,wifi,USB外接网卡网络变化,没有过多测试,我主要测试的 USB 网卡网络变化,应该各种网络变化都可以监听到。
1、写一个监听类
package com.tky.phm.net;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class NetworkCallbackImplextends ConnectivityManager.NetworkCallback {
private StringTAG ="NetworkCallbackImpl";
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable: 网络已连接");
}
@Override
public void onLost(Network network) {
super.onLost(network);
Log.e(TAG, "onLost: 网络已断开");
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.d(TAG, "onCapabilitiesChanged: 网络类型为wifi");
}else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.d(TAG, "onCapabilitiesChanged: 蜂窝网络");
}else {
Log.d(TAG, "onCapabilitiesChanged: 其他网络");
}
}
}
}
}
2、注册监听类
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
NetworkCallbackImpl networkCallback =new NetworkCallbackImpl();
NetworkRequest.Builder builder =null;
builder =new NetworkRequest.Builder();
NetworkRequest request = builder.build();
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr !=null) {
connMgr.registerNetworkCallback(request, networkCallback);
}
}
}catch (Exception e) {
e.printStackTrace();
}
3、添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4、结束