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

如何替换已废弃的ConnectivityManager.allNetworks网络检测代码

Android 网络连接状态检测废弃代码替换方案

前置条件

首先需要在AndroidManifest.xml中声明网络状态访问权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

你代码中被标记废弃的allNetworks是Android 12(API 31)起废弃的字段API,官方推荐按业务场景选择以下替换方案:

方案1:常用场景 - 实时监听网络状态(推荐)

原代码中已经注册了DefaultNetworkCallback,我们可以直接结合回调能力更精准的监听网络变化,避免频繁主动轮询,替换后的完整代码如下:

private val isNetworkAvailable = MutableStateFlow(false)
// 保存回调实例用于后续注销,避免内存泄漏
private var networkCallback: ConnectivityManager.NetworkCallback? = null

fun checkNetworkAvailability(context: Context): MutableStateFlow<Boolean> {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            updateNetworkStatus(connectivityManager)
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            updateNetworkStatus(connectivityManager)
        }

        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            super.onCapabilitiesChanged(network, networkCapabilities)
            updateNetworkStatus(connectivityManager)
        }
    }

    // 注册网络变化回调
    connectivityManager.registerDefaultNetworkCallback(networkCallback!!)

    // 首次调用时初始化当前网络状态
    updateNetworkStatus(connectivityManager)

    return isNetworkAvailable
}

private fun updateNetworkStatus(connectivityManager: ConnectivityManager) {
    val hasValidInternet = connectivityManager.activeNetwork?.let { network ->
        val capabilities = connectivityManager.getNetworkCapabilities(network)
        // 同时校验网络是否具备互联网能力、且已通过连通性验证
        capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
    } ?: false
    isNetworkAvailable.value = hasValidInternet
}

// 请在组件销毁/不需要监听时调用该方法注销回调,避免内存泄漏
fun stopNetworkListener(context: Context) {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    networkCallback?.let {
        connectivityManager.unregisterNetworkCallback(it)
        networkCallback = null
    }
}

方案2:单次查询所有网络状态(替换原有遍历逻辑)

如果你确实需要遍历所有已注册的网络判断是否有可用网络,直接将原遍历部分的connectivityManager.allNetworks替换为connectivityManager.getAllNetworks()即可,该方法兼容API 21及以上版本,是官方指定的替代API:

var isConnected = false
// 替换原废弃的allNetworks字段
connectivityManager.getAllNetworks().forEach { network ->
    val networkCapability = connectivityManager.getNetworkCapabilities(network)
    networkCapability?.let {
        if(it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 
            && it.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
            isConnected = true
            return@forEach
        }
    }
}

低版本兼容说明

如果你的应用minSdk低于23,需要补充版本判断兼容旧版本系统:

val isConnected = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    connectivityManager.activeNetwork?.let { network ->
        val capabilities = connectivityManager.getNetworkCapabilities(network)
        capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
    } ?: false
} else {
    @Suppress("DEPRECATION")
    connectivityManager.activeNetworkInfo?.isConnected == true
}

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:36:03