Android中isConnected方法为何在关闭Wi-Fi后仍始终返回true?
解决Wi-Fi网络状态误判的问题
我之前也踩过这个坑!你用的getActiveNetworkInfo()方法有个致命局限——它只能检测设备是否连接到了Wi-Fi热点,但没法验证这个热点本身能不能访问互联网。比如你连了个没插网线的路由器,或者热点本身没联网,这个方法依然会返回isConnected() == true,导致你误以为有网。而且这个API在Android 10(API 29)已经被官方废弃了,推荐用更可靠的新API来替代。
解决方案1:单次检测是否有可用互联网(适合一次性判断)
用getNetworkCapabilities()来检查网络是否具备有效互联网连接的能力,核心是验证NET_CAPABILITY_VALIDATED属性——它表示网络已经通过了互联网连接验证:
private boolean hasValidInternetConnection(Context context) { ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connMgr == null) { return false; } Network activeNetwork = connMgr.getActiveNetwork(); if (activeNetwork == null) { return false; } NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(activeNetwork); return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); }
调用示例:
if (hasValidInternetConnection(this)) { Loading_News(); } else { // 处理无网逻辑,比如提示用户检查网络 }
解决方案2:实时监听网络状态变化(适合动态响应场景)
如果你的应用需要在网络状态改变时自动触发逻辑,可以用NetworkCallback来监听网络的可用/断开事件:
private ConnectivityManager.NetworkCallback networkStatusCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network); if (capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { // 确认有可用互联网,执行加载逻辑 Loading_News(); } } @Override public void onLost(@NonNull Network network) { super.onLost(network); // 网络断开,提示用户或停止加载操作 } }; // 在Activity的onCreate中注册监听 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (connMgr != null) { NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(); connMgr.registerNetworkCallback(networkRequest, networkStatusCallback); } } // 在onDestroy中注销监听,避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (connMgr != null) { connMgr.unregisterNetworkCallback(networkStatusCallback); } }
必要权限
记得在AndroidManifest.xml里添加网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这个权限属于正常权限,不需要动态申请,只要在清单中声明即可。
内容的提问来源于stack exchange,提问作者coding
相关产品推荐
相关产品推荐

