You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:17:43