当前位置: 首页 > news >正文

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

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

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. 生命周期管理

相关文章:

  • MQTT实现智能家居------4、在Linux上运行MQTT
  • MySql常用指令
  • 请谈谈 React 中的状态管理,如何使用 Context API 和 Redux 进行状态管理?
  • 在 Windows 下的 Docker 中安装 R语言
  • 微服务即时通信系统---(六)语音识别子服务
  • Mac 上安装多版本的 JDK 且实现 自由切换
  • Zabbix问题记录2--踩坑HttpRequest,header添加无效
  • 4.static关键字和const关键字的作用【高频】
  • 算法思想-动态规划算法
  • Vue的项目创建以及项目目录与组合式API
  • 快速入门——状态管理VueX
  • 动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题
  • linux /var/log/syslog过大问题及解决 Systemd定时器用于清除
  • 深入理解 `Sinks.Empty<Void>` 和 `Mono<Void>`:如何触发完成信号并结合 WebSocket 示例
  • axios、axios二次封装、api解耦
  • CF 58A.Chat room(Java实现)
  • 【ProtoBuf】proto3语法(一)
  • ctfshow——版本控制泄露源码
  • OPPO高级大模型算法岗内推
  • LeetCode 热题100 141. 环形链表
  • 好一点的网站建设/友情链接查询
  • 加强两微一端和门户网站建设/广告推广方案怎么写
  • 大数据比赛网站建设/第三方推广平台
  • node.js 网站开发 公司 广州/苏州seo公司
  • 网站栏目架构/seo教程有什么
  • 做网站还能赚钱吗/民生热点新闻