Diia项目中的网络状态监听:ConnectivityManager使用实践

Diia项目中的网络状态监听:ConnectivityManager使用实践

【免费下载链接】android-diia 【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia

在移动应用开发中,网络状态的实时监听是确保用户体验的关键环节。Diia项目通过系统服务ConnectivityManager(网络连接管理器)实现了网络状态的精准监测,本文将从实现原理、核心代码解析和最佳实践三个维度,详解该功能在项目中的落地方式。

实现架构概览

Diia项目的网络监听模块采用观察者模式设计,通过ConnectivityManager注册网络回调,将网络状态转化为可观察数据流。核心实现位于opensource/src/main/java/ua/gov/diia/opensource/data/data_source/network/connectivity/NetworkConnectivityObserver.kt,该类实现了项目自定义的ConnectivityObserver接口,提供网络可用性判断和状态监听两大核心能力。

核心代码解析

1. 系统服务初始化

通过Context获取ConnectivityManager实例是实现的基础,代码如下:

private val connectivityManager =
    context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

2. 网络可用性判断

通过检查网络 capabilities(网络能力)判断当前网络是否可用:

override val isAvailable: Boolean
    get() {
        val caps = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        return isNetworkAvailable(caps)
    }

private fun isNetworkAvailable(capabilities: NetworkCapabilities?): Boolean {
    if (capabilities == null) return false
    return (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || 
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
}

3. 网络状态监听

使用callbackFlow将系统回调转换为Kotlin Flow,实现响应式状态监听:

override fun observe(): Flow<Boolean> = callbackFlow {
    val callback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            trySend(true) // 网络可用
        }

        override fun onLost(network: Network) {
            trySend(false) // 网络丢失
        }

        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            trySend(isNetworkAvailable(networkCapabilities)) // 能力变化时重新判断
        }

        override fun onUnavailable() {
            trySend(false) // 网络不可用
        }
    }

    connectivityManager.registerNetworkCallback(request, callback)
    awaitClose { connectivityManager.unregisterNetworkCallback(callback) } // 自动取消注册
}

网络请求构建

项目通过NetworkRequest指定监听的网络类型,仅关注WiFi和蜂窝网络:

private val request = NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) // 需互联网能力
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // WiFi网络
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 蜂窝网络
    .build()

最佳实践总结

  1. 生命周期管理:使用awaitClose确保回调在Flow收集结束时自动取消注册,避免内存泄漏。
  2. 多场景适配:同时监听onAvailable、onLost、onCapabilitiesChanged等回调,覆盖网络切换、断连等场景。
  3. 权限配置:需在AndroidManifest.xml中声明网络权限:
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

相关模块参考

通过以上实现,Diia项目实现了高效、可靠的网络状态监听功能,为离线缓存、操作重试等特性提供了基础支撑。实际开发中可根据业务需求扩展网络类型判断逻辑,如增加对以太网、其他网络类型等网络类型的支持。

【免费下载链接】android-diia 【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值