网络状态监听 → ConnectivityManager + Flow

网络状态监听 → ConnectivityManager + Flow

老写法(Java + BroadcastReceiver)

java 复制代码
public class NetworkReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        boolean isConnected = info != null && info.isConnected();
        updateNetworkState(isConnected);
    }
}

// 注册
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkReceiver(), filter);

问题在哪里

NetworkInfo 已废弃(API 29+)。广播接收必须手动注册/解注册,生命周期管理容易泄漏。只能拿到"是否连接",具体网络类型获取麻烦。

新写法(ConnectivityManager + Flow)

kotlin 复制代码
class NetworkMonitor(context: Context) {

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

    val isConnected: Flow<Boolean> = callbackFlow {
        val callback = object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                trySend(true)
            }

            override fun onLost(network: Network) {
                trySend(false)
            }
        }

        val request = NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .build()
        connectivityManager.registerNetworkCallback(request, callback)

        // 发送当前状态
        val currentNetwork = connectivityManager.activeNetwork
        val capabilities = connectivityManager.getNetworkCapabilities(currentNetwork)
        trySend(capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true)

        awaitClose {
            connectivityManager.unregisterNetworkCallback(callback)
        }
    }
}

// 使用
viewModelScope.launch {
    networkMonitor.isConnected.collect { connected ->
        tvStatus.text = if (connected) "已连接" else "无网络"
    }
}

一句话注意

callbackFlow 是把回调 API 转为 Flow 的标准方式。trySend 在 Flow 里发射元素,awaitClose 在 Flow 被取消时自动执行清理逻辑(解注册 callback),不需要手动管理生命周期。

NetworkRequest.Builder().addCapability() 可以精确过滤网络类型------NET_CAPABILITY_INTERNET 表示该网络能访问互联网,TRANSPORT_WIFI 限制只监听 WiFi。addTransportType 也可以在 Builder 上链式调用组合多个条件。


Java Android 老项目迁移系列,持续更新中。

相关推荐
chuan.bai11 小时前
Java RAG 实战(第 8 篇):Spring Boot RAG 查询 API
java·spring boot·贪心算法
FlyWIHTSKY11 小时前
idea中集成claude功能
java·ide·人工智能·intellij-idea·cloudera
Java成神之路-11 小时前
Spring AI 统一结构化返回:ChatModel / ChatClient 两种实现方式
java·springaialibaba
Mr. zhihao11 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
vx-程序开发11 小时前
springboot旅游推介平台---附源码24175
java·spring boot·python·spring cloud·eclipse·django·idea
游戏开发爱好者812 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
艾莉丝努力练剑12 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
小蒜学长12 小时前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆12 小时前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接