在 Android 开发中,实时感知网络状态对于提升用户体验至关重要。以下方案基于 ConnectivityManager 实现网络可用性的判断与状态监听。
权限配置
首先需在清单文件中添加网络状态访问权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
核心工具方法
为了复用逻辑,建议封装静态工具类。以下是常用的判断方法:
1. 通用网络检查
判断当前设备是否有任何网络连接。
public boolean isNetworkConnected(Context context) {
if (context == null) return false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
return info != null && info.isAvailable();
}
2. 特定网络类型检查
区分 WiFi 和移动数据状态。
public boolean isWifiConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifiInfo != null && wifiInfo.isAvailable();
}
public boolean isMobileConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return mobileInfo != null && mobileInfo.isAvailable();
}
3. 获取网络类型
返回当前连接的具体类型标识。
public static int getConnectedType(Context context) {
if (context == null) return -1;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
return info.getType();
}
return -1;
}
网络状态监听
当网络断开或重连时,应用需要做出响应。推荐使用 BroadcastReceiver。
注册与注销
在 Activity 或 Service 中管理生命周期。
// 定义接收器
BroadcastReceiver networkReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNet = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNet.isConnected() && !wifiNet.isConnected()) {
Log.i("TAG", "网络已断开");
} else {
Log.i("TAG", "网络已连接");
}
}
};
// 注册
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkReceiver, filter);
// 注销 (建议在 onDestroy 中调用)
unregisterReceiver(networkReceiver);
注意事项
- API 兼容性:TYPE_WIFI 和 TYPE_MOBILE 在新版 Android 中已被标记为废弃,但在兼容旧版本时仍广泛使用。生产环境建议查阅官方文档确认最新 API。
- TelephonyManager 对比:虽然可以通过 TelephonyManager 监听数据连接状态,但实测发现回调频繁且状态有时不准确,容易收到重复信号。相比之下,ConnectivityManager 更加稳定可靠。
- 后台运行:若需在后台监听,建议配合 Service 使用,并务必注意内存泄漏问题,及时取消注册。
- 特殊场景:测试中发现关闭路由后程序可能未立即捕获断开信号,这通常是因为设备自动切换到了其他可用网络(如从 WiFi 切到 4G),属于正常现象。
