Android 8.0 (API 26) 对广播机制做了哪些变化

news/2025/2/27 1:32:50

大部分隐式广播无法通过静态注册接收,除了以下白名单广播:

ACTION_BOOT_COMPLETED
ACTION_TIMEZONE_CHANGED
ACTION_LOCALE_CHANGED
ACTION_MY_PACKAGE_REPLACED
ACTION_PACKAGE_ADDED
ACTION_PACKAGE_REMOVED

需要以动态注册方案替换:

class MainActivity : AppCompatActivity() {
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            // 处理广播
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 使用动态注册替代静态注册
        registerReceiver(receiver, IntentFilter().apply {
            addAction("your.custom.action")
        })
    }
}

后台应用发送广播受到限制:

// 后台应用发送广播限制
// 解决方案:
// 1. 使用前台服务
startForegroundService(intent)

// 2. 使用 LocalBroadcastManager
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)

// 3. 使用显式广播
Intent(this, MyReceiver::class.java).also { intent ->
    sendBroadcast(intent)
}

性能优化建议:

// 使用有序广播替代多个广播
sendOrderedBroadcast(intent, null)

// 使用粘性广播替代定时轮询
sendStickyBroadcast(intent)

// 使用 EventBus 等替代方案
implementation 'org.greenrobot:eventbus:3.2.0'

LocalBroadcastManager 的实现原理:

// LocalBroadcastManager 核心实现原理
class LocalBroadcastManager private constructor(private val context: Context) {
    // 1. 使用 Handler 处理消息
    private val handler = Handler(Looper.getMainLooper())
    
    // 2. 广播接收器的注册表
    private val receivers = HashMap<String, ArrayList<ReceiverRecord>>()
    
    // 3. 待处理的广播队列
    private val pendingBroadcasts = ArrayList<BroadcastRecord>()
    
    // 4. 注册广播接收器
    fun registerReceiver(receiver: BroadcastReceiver, filter: IntentFilter) {
        synchronized(receivers) {
            // 记录接收器和过滤器
            val record = ReceiverRecord(filter, receiver)
            
            filter.actionsIterator().forEach { action ->
                // 按 action 分类存储接收器
                receivers.getOrPut(action) { ArrayList() }.add(record)
            }
        }
    }
    
    // 5. 发送广播
    fun sendBroadcast(intent: Intent) {
        synchronized(receivers) {
            // 查找匹配的接收器
            val matchingReceivers = ArrayList<ReceiverRecord>()
            
            // 根据 action 找到对应的接收器
            receivers[intent.action]?.forEach { record ->
                if (record.filter.match(intent)) {
                    matchingReceivers.add(record)
                }
            }
            
            if (matchingReceivers.isEmpty()) return
            
            // 将广播加入队列
            synchronized(pendingBroadcasts) {
                pendingBroadcasts.add(BroadcastRecord(intent, matchingReceivers))
                
                // 通过 Handler 发送消息
                handler.post {
                    executePendingBroadcasts()
                }
            }
        }
    }
    
    // 6. 执行广播
    private fun executePendingBroadcasts() {
        while (true) {
            val broadcast = synchronized(pendingBroadcasts) {
                if (pendingBroadcasts.isEmpty()) null
                else pendingBroadcasts.removeAt(0)
            } ?: break
            
            // 在主线程分发广播
            broadcast.receivers.forEach { receiver ->
                receiver.receiver.onReceive(context, broadcast.intent)
            }
        }
    }
}

核心原理:

  1. 单例模式管理
  2. Handler 消息机制
  3. 同步队列处理
  4. 主线程分发
  5. 内存级别通信

实现特点:

  1. 不经过 AMS
  2.  无进程间通信
  3. 效率更高
  4. 安全性好
  5. 同步执行

优化设计:

  1. 避免广播风暴
  2. 减少内存占用
  3.  保证顺序执行
  4.  线程安全控制
  5. 生命周期管理

http://www.niftyadmin.cn/n/5869351.html

相关文章

【AI+智造】基于DeepSeek的船舶海工设备多维度数据分析技术方案——以南通船舶制造企业为例

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月25日 以下技术方案基于南通市制造业特点&#xff0c;结合船舶海工行业实际应用场景&#xff0c;针对设备数据量化分析需求展开论述。全文以技术可行性、行业适配性及实施路径为核心&#xff0c;深度整…

H3C商场无线零售解决方案技术资料汇总集

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 前言 由于内容较多&#xff0c;且不便于排版&#xff0c;为避免资源失效&#xff0c;请用手机点击链接进行保存&#xff0c;若链接生效请及时反馈&#xff0c;谢谢~ 正文 链接如下&#xff08;为避免资源失效&#x…

RK3399 Android10双WiFi功能实现

在Android9开始,就支持WiFi并发功能,在官方链接(WLAN STA/AP 并发 | Android Open Source Project)有如下描述: Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能。对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 (sof…

[回顾]从原型链视角解读Vue底层实现Vue VueCompoent VM VC关系

从原型链视角解读VueComponent与Vue关系 原型链 根据,原型链涉及三个关键属性:__proto__是所有对象的私有属性,指向原型链的第一个元素;prototype是函数的属性,实例对象不拥有它;constructor指向构造函数。提到原型链是JS中实现继承的机制,通过属性链式查找属性,直到…

计算机网络————(三)

前文二 前文一 Websocket协议 是一种存在TCP协议之上的协议 当客户端需要了解服务器是否更新就需要不断给客户端发送请求询问是否更新&#xff0c;这行会造成服务端压力很大 而Websocket相当于服务器一旦更新了就会给客户端发送消息表明自己更新了&#xff0c;类似客户端订阅…

模型蒸馏:让人工智能更智能、更小、更高效的艺术

你有没有想过,我们如何才能让一个需要巨大计算能力的庞大人工智能模型变得更精简、更快速、更强大?答案在于模型蒸馏,这是一种允许知识从大型、计算成本高昂的人工智能系统转移到较小、更高效的系统的技术,而不会牺牲智能。 什么是模型蒸馏 模型蒸馏是一种技术,其…

神经网络 - 神经元

人工神经元(Artificial Neuron)&#xff0c;简称神经元(Neuron)&#xff0c;是构成神经网络的基本单元&#xff0c;其主要是模拟生物神经元的结构和特性&#xff0c;接收一组输入信号并产生输出。 生物学家在 20 世纪初就发现了生物神经元的结构。一个生物神经元通常具有多个树…

基于GO语言的车牌识别api技术-港澳车牌文字识别

随着科技的飞速发展&#xff0c;智能化管理逐渐渗透到我们生活的方方面面。车牌识别技术作为智能交通的重要组成部分&#xff0c;不仅极大提升了交通管理的效率&#xff0c;还为市民出行带来了更多便利。而港澳地区的车牌识别技术&#xff0c;凭借其高效、精准、快速的特点&…