Android Java监听WiFi/移动数据网络连接状态的实现方案问询
当然可以实现!不过你说的NetworkManager应该是Android里的ConnectivityManager(大概率是笔误啦)——它就是专门用来监听网络连接状态变化的核心类,完全能满足你的需求,甚至比单纯的WiFi开关监听更强大。
实现方案:监听网络连接状态变化
1. 先声明必要权限
在AndroidManifest.xml中添加权限,因为要访问网络状态信息:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 可选,但如果要验证真实网络可用性建议加上 -->
2. 方式一:使用广播接收器(传统方案)
和你之前监听WiFi开关的逻辑类似,只不过要监听的是ConnectivityManager.CONNECTIVITY_ACTION广播。注意:Android 7.0(API 24)之后,这个广播不能静态注册,只能动态注册,所以我们在代码里动态注册/注销:
步骤1:创建广播接收器
private BroadcastReceiver networkStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 获取ConnectivityManager实例 ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取当前活跃网络的信息 NetworkInfo activeNetwork = connManager.getActiveNetworkInfo(); // 判断网络是否可用(已连接且能正常通信) boolean isNetworkAvailable = activeNetwork != null && activeNetwork.isConnected(); if (isNetworkAvailable) { // 还可以区分是WiFi还是移动数据 if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { Log.v("NetworkStatus", "✅ WiFi已连接,网络可用"); } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { Log.v("NetworkStatus", "✅ 移动数据已连接,网络可用"); } } else { Log.v("NetworkStatus", "❌ 网络不可用"); } } };
步骤2:动态注册/注销接收器
建议在页面的生命周期方法里注册和注销,避免内存泄漏,比如在Activity中:
@Override protected void onResume() { super.onResume(); // 创建IntentFilter,指定要监听的广播动作 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkStateReceiver, filter); } @Override protected void onPause() { super.onPause(); // 页面暂停时注销接收器 unregisterReceiver(networkStateReceiver); }
3. 方式二:使用NetworkCallback(推荐高版本系统)
从Android 10(API 29)开始,getActiveNetworkInfo()被标记为过时,官方推荐使用ConnectivityManager.NetworkCallback来监听网络状态变化,这个方式功能更灵活,还能监听网络能力的变化:
步骤1:创建NetworkCallback实例
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { // 网络可用时触发 @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); Log.v("NetworkStatus", "✅ 网络已连接"); } // 网络断开时触发 @Override public void onLost(@NonNull Network network) { super.onLost(network); Log.v("NetworkStatus", "❌ 网络已断开"); } // 网络能力变化时触发(比如从WiFi切换到移动数据) @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities capabilities) { super.onCapabilitiesChanged(network, capabilities); // 检查是否具备互联网访问能力 boolean hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); // 判断网络类型 boolean isWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); boolean isMobile = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); if (hasInternet) { if (isWifi) { Log.v("NetworkStatus", "🔵 当前是WiFi网络,可访问互联网"); } else if (isMobile) { Log.v("NetworkStatus", "🔴 当前是移动数据网络,可访问互联网"); } } else { Log.v("NetworkStatus", "⚫ 当前网络无法访问互联网"); } } };
步骤2:注册NetworkCallback
// 在合适的时机(比如Activity的onCreate)注册 ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 构建网络请求,指定我们要监听的网络类型(这里监听具备互联网访问的网络) NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(); // 注册回调 connManager.registerNetworkCallback(networkRequest, networkCallback);
步骤3:注销NetworkCallback
记得在页面销毁时注销,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); connManager.unregisterNetworkCallback(networkCallback); }
总结
- 如果你需要兼容较低版本的Android系统,用广播接收器的方式更稳妥;
- 如果目标系统是Android 10及以上,推荐使用NetworkCallback,它能提供更细致的网络状态信息,也更符合官方的发展趋势。
内容的提问来源于stack exchange,提问作者MantyQ2341414514




