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

发布于:2025-02-28 ⋅ 阅读:(13) ⋅ 点赞:(0)

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

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