Android判断网络连接、监控网络状态
1、判断网络状态
通过ConnectivityManager和NetworkInfo进行相关网络状态的判断。需要相应的权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />1.1、当前手机是否有网络连接
/**
* @param context 传入上下文
* @return 当前手机是否有网络连接
*/
public boolean isNetworkConnected(Context context) {
if (null != context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (null != networkInfo) {
return networkInfo.isAvailable();
}
}
return false;
}1.2、WiFi网络是否可用
/**
* @param context 传入上下文
* @return WiFi网络是否可用
*/
public boolean isWifiConnected(Context context) {
if (null != context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (null != wifiNetworkInfo) {
return wifiNetworkInfo.isAvailable();
}
}
return false;
}1.3、当前手机移动网络是否可用
/**
* @param context 传入上下文
* @return 返回当前手机移动网络是否可用
*/
@SuppressWarnings("deprecation")
public boolean isMobileConnected(Context context) {
if (null != context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileNetworkinfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (null != mobileNetworkinfo) {
return mobileNetworkinfo.isAvailable();
}
}
return false;
}1.4、当前网络连接的类型
/**
* @param context 传入上下文
* @return 返回当前网络连接的类型,诸如{@link ConnectivityManager#TYPE_WIFI,ConnectivityManager#TYPE_MOBILE}等等
*/
@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)
public int getConnectedTye(Context context) {
if (null != context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (null != networkInfo && networkInfo.isAvailable()) {
return networkInfo.getType();
}
}
return -1;
}上面的那些方法目前为止都还可以使用(@SuppressWarnings("deprecation")),不过已经被Android官方标记为deprecated不再推荐使用。推荐使用ConnectivityManager.NetworkCallback替代NetworkInfo获取网络状态。

1.5、新的API判断网络连接
Android已经将NetworkInfo标记为deprecated,尽量避免使用。
①网络是否已连接
/**
* 网络是否已连接
*
* @return true:已连接 false:未连接
*/
@SuppressWarnings("deprecation")
@RequiresPermission(ACCESS_NETWORK_STATE)
public static boolean iConnected(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
|| networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|| networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
}
return false;
}②Wifi是否已连接
/**
* Wifi是否已连接
*
* @return true:已连接 false:未连接
*/
@SuppressWarnings("deprecation")
public static boolean isWifiConnected(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
}
return false;
}③是否为移动网络
/**
* 是否为流量
*/
@SuppressWarnings("deprecation")
public static boolean isMobileData(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
}
return false;
}2、监听网络状态
通常网络状态发生变化的时候需要进行对应的处理。比如播放视频、音乐的时候网络突然断开或者切换到移动网络,就需要暂停播放。断网之后恢复网络继续播放。
有两种方法,一种Android 5.0之前通过监听网络变化时发出的广播。另一种推荐使用的方法是通过ConnectivityManager.NetworkCallback注册网络状态回调。
2.1、通过BroadcastReceiver监听
先定义一个广播,在onReceive()方法中处理网络变化的逻辑。一般还需要进行网络状态的判断,网络变化时断开还是连接网络。
private BroadcastReceiver mNetChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (NET_CHANGE_ACTION.equals(action)) {
//业务逻辑
}
}
};监听网络发生变化发出的广播android.net.conn.CONNECTIVITY_CHANGE
public static final String NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";在onResume()中注册广播监听器,在onPause()中反注册。
2.2、通过ConnectivityManager.NetworkCallback回调
继承ConnectivityManager.NetworkCallback类,重写onAvailable()、onLost()、onCapabilitiesChanged()等方法。这些方法在父类ConnectivityManager.NetworkCallback中都是空方法。
private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback() {
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
}
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
}
public void onLost(@NonNull Network network) {
super.onLost(network);
}
public void onUnavailable() {
super.onUnavailable();
}
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
}
public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
}
public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
super.onBlockedStatusChanged(network, blocked);
}
}1、要想监听网络的连接和断开,应该在onAvailable()和onLost()中,成对出现。
2、其他的几个回调使用场景会少一点,并且onCapabilitiesChanged()会回调多次,所以使用它时我们要慎重,避免重复的操作,但是可以保证最后一次回调,网络的连接一定是连接成功的。
通过ConnectivityManager注册ConnectivityManager.NetworkCallback回调监听接口
mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder().build(), mNetworkCallback);回调也需要对应的进行反注册
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);在ConnectivityManager.NetworkCallback的回调方法中不能操作UI,尽管是在Activity定义的全局匿名内部类,在TextView中显示网络变化提示的时候会出现奔溃。

推荐博客:

