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

Kotlin中使用不同构造函数构建时如何复用重写方法?

Android Kotlin 兼容不同API版本的NetworkCallback构造方案

你可以通过抽离回调核心逻辑,再根据API版本包装对应构造的NetworkCallback来避免重复代码,只需要写一次重写方法的核心实现。

实现方案

先把onCapabilitiesChanged的业务逻辑抽成独立实现,再根据API版本选择对应的构造函数创建NetworkCallback实例,复用同一套逻辑:

val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

// 抽离核心回调逻辑
val coreCallback = object : NetworkCallback() {
    override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val ssid =
            if (Build.VERSION.SDK_INT >= 29) {
                (networkCapabilities.transportInfo as WifiInfo).ssid
            }
            else {
                (applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid
            }
        Log.d(TAG, "onCapabilitiesChanged network: $network ssid: $ssid")
    }
}

// 根据API版本选择对应构造的NetworkCallback并注册
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    cm.registerDefaultNetworkCallback(object : NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) {
        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            coreCallback.onCapabilitiesChanged(network, networkCapabilities)
        }
    })
} else {
    cm.registerDefaultNetworkCallback(coreCallback)
}

更简洁的封装写法

如果需要多次使用该回调,可以把逻辑封装成函数,进一步简化调用:

private fun buildNetworkCallback(): NetworkCallback {
    val coreLogic = { network: Network, capabilities: NetworkCapabilities ->
        val ssid =
            if (Build.VERSION.SDK_INT >= 29) {
                (capabilities.transportInfo as WifiInfo).ssid
            }
            else {
                (applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid
            }
        Log.d(TAG, "onCapabilitiesChanged network: $network ssid: $ssid")
    }

    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        object : NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) {
            override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
                super.onCapabilitiesChanged(network, networkCapabilities)
                coreLogic(network, networkCapabilities)
            }
        }
    } else {
        object : NetworkCallback() {
            override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
                super.onCapabilitiesChanged(network, networkCapabilities)
                coreLogic(network, networkCapabilities)
            }
        }
    }
}

// 调用时
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
cm.registerDefaultNetworkCallback(buildNetworkCallback())

这种方式既保证了不同API版本使用对应的构造函数,又只维护一套核心业务逻辑,避免了代码冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:20:27