Android源码分析--广播的注册、发送和接收

广播可以发送多种类型,包括无序广播(普通广播)、有序广播和粘性广播。

Android广播的分类:

1、 普通(无序)广播:使用 sendBroadcast 发送广播。这种广播可以依次传递给各个处理器去处理。

2、 有序广播:使用 sendOrderedBroadcast 发送广播。这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除。

3、 粘性消息:使用 sendStickyBroadcast 发送广播。粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。

注意:普通广播和粘性消息不能被截获,而有序广播是可以被截获的。

这里我们以最简单的普通广播发送为例进行分析。

ContextImpl请求AMS发送广播

  • 当我们需要发送无序广播时,需要调用Context的 sendBroadcast 方法,然后在 ContextWrappersendBroadcast 中调用 ContextImplsendBroadcast 方法,最终会调用AMS的 broadcastIntent 方法。

  • 在AMS的 broadcastIntent 方法中,首先对发送的广播进行合法性校验,然后调用其 broadcastIntentLocked 方法。

  • 在AMS的 broadcastIntentLocked 方法中做了很多事情,对广播做了一系列的处理后,最终调用 broadcastQueueForIntent 构建了广播队列,然后新建BroadcastRecord对象并将其传入广播队列中,同时执行广播队列的 scheduleBroadcastLocked 方法。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章