广播接收器 → Flow + Lifecycle

广播接收器 → Flow + Lifecycle

老写法(Java + BroadcastReceiver)

java 复制代码
private BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        tvBattery.setText("电量:" + level + "%");
    }
};

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(batteryReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(batteryReceiver);
}

问题在哪里

register/unregister 必须在正确的生命周期成对调用,时机一错就崩。每个广播接收器都要写注册逻辑和解注册逻辑,多个广播到处都是散落的 IntentFilter。

新写法(Flow + Lifecycle)

kotlin 复制代码
// 封装为 Flow
fun batteryLevelFlow(context: Context): Flow<Int> = callbackFlow {
    val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
            trySend(level)
        }
    }
    context.registerReceiver(receiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
    awaitClose { context.unregisterReceiver(receiver) }
}

// 使用 --- 自动绑定生命周期
lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.STARTED) {
        batteryLevelFlow(this@MainActivity).collect { level ->
            tvBattery.text = "电量:$level%"
        }
    }
}

一句话注意

callbackFlow 内部 registerReceiverawaitCloseunregisterReceiver,生命周期完全自动绑定,不需要手动 register/unregister。repeatOnLifecycle(STARTED) 确保前台才收集、后台自动取消,和 onResume/onPause 的注册时机语义一致。

Intent.ACTION_BATTERY_CHANGED 这种粘性广播不能用 context.registerReceiver 注册结果返回 null 的问题------因为它是粘性广播,即使是首次注册也会立刻收到回调,没有问题。但注意这个广播不能通过 manifest 静态注册,只能动态注册。


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

相关推荐
2601_9622986713 分钟前
正则表达式引擎 哪些
java·python·perl·pcre·正则表达式引擎
孙克旭_14 分钟前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx17 分钟前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
布吉岛的石头18 分钟前
Java 程序员第 48 阶段1:Transformer 架构总览与自注意力直觉,从 RNN 痛点理解注意力机制
java·架构·transformer
mmsx28 分钟前
osmdroid 踩坑清单:大级别崩溃/路径消失/低内存卡顿/范围缩放不准
android·源码·地图·osmdroid
吴声子夜歌29 分钟前
Guava——事件总线
java·网络·guava
en.en..33 分钟前
Ubuntu嵌入式开发 export环境变量
java·开发语言·数据库
gf132111134 分钟前
【python_回复邮件】
android·java·python
攻城有术39 分钟前
专项攻克——重写 Redis 依赖包方法的 6 种实现方式
java·数据库·redis·bootstrap
跨境数据猎手1 小时前
京东开放平台商品详情接口(jd.item_get):签名、缓存与批量采集
java·spring·缓存