欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Android 8.0 (API 26) 对广播机制做了哪些变化

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

2025/5/11 1:01:49 来源:https://blog.csdn.net/xhf_123/article/details/145860418  浏览:    关键词: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()) nullelse 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. 生命周期管理

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词