Diia项目中的网络状态监听:ConnectivityManager使用实践
【免费下载链接】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()
最佳实践总结
- 生命周期管理:使用awaitClose确保回调在Flow收集结束时自动取消注册,避免内存泄漏。
- 多场景适配:同时监听onAvailable、onLost、onCapabilitiesChanged等回调,覆盖网络切换、断连等场景。
- 权限配置:需在AndroidManifest.xml中声明网络权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
相关模块参考
- 网络状态接口定义:core/src/main/java/ua/diia/core/network/connectivity/ConnectivityObserver.kt
- 网络工具类:core/src/main/java/ua/diia/core/utils/NetworkUtils.kt
通过以上实现,Diia项目实现了高效、可靠的网络状态监听功能,为离线缓存、操作重试等特性提供了基础支撑。实际开发中可根据业务需求扩展网络类型判断逻辑,如增加对以太网、其他网络类型等网络类型的支持。
【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



