ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
Broadcast,汉语意思为“广播”。它是Android平台中的一种通知机制。从广义来说,它是一种进程间通信的手段。有广播,就对应有广播接收者。Android中四大组件之一的BroadcastReceiver即代表广播接收者。目前,系统提供两种方式来声明一个广播接收者。 - 在AndroidManifest.xml中声明<receiver>标签。在应用程序运行时,系统会利用Java反射机制构造一个广播接收者实例。本书将这种广播接收者称为静态注册者或静态接收者。 - 在应用程序运行过程中,可调用Context提供的registerReceiver函数注册一个广播接收者实例。本书将这种广播接收者称为动态注册者或动态接收者。与之相对应,当应用程序不再需要监听广播时(例如当应用程序退到后台时),则要调用unregisterReceiver函数撤销之前注册的BroadcastReceiver实例。 当系统将广播派发给对应的广播接收者时,广播接收者的onReceive函数会被调用。在此函数中,可对该广播进行相应处理。 另外,Android定义了三种不同类型的广播发送方式,它们分别是: - 普通广播发送方式,由sendBroadcast及相关函数发送。以工作中的场景为例,当程序员们正埋头工作之时,如果有人大喊一声“吃午饭去”,前刻还在专心编码的人即作鸟兽散。这种方式即为普通广播发送方式,所有对“吃午饭”感兴趣的接收者都会响应。 - 串行广播发送方式,即ordered广播,由sendOrdedBroadcast及相关函数发送。在该类型方式下,按接收者的优先级将广播一个个地派发给接收者。只有等这一个接收者处理完毕,系统才将该广播派发给下一个接收者。其中,任意一个接收者都可以中止后续的派发流程。还是以工作中的场景为例:经常有项目经理(PM)深夜组织一帮人跟踪bug的状态。PM看见一个bug,问某程序员,“这个bug你能改吗?”如果得到的答案是“暂时不会”或“暂时没时间”,他会将目光转向下一个神情轻松者,直到找到一个担当者为止。这种方式即为ordered广播发送方式,很明显,它的特点是“一个一个来”。 - Sticky广播发送方式,由sendStickyBroadcast及相关函数发送。Sticky的意思是“粘”,其背后有一个很重要的考虑。我们举个例子:假设某广播发送者每5秒发送一次携带自己状态信息的广播,此时某个应用进程注册了一个动态接收者来监听该广播,那么该接收者的OnReceive函数何时被调用呢?在正常情况下需要等这一轮的5秒周期结束后才调用(因为发送者在本周期结束后会主动再发一个广播)。而在Sticky模式下,系统将马上派发该广播给刚注册的接收者。注意,这个广播是系统发送的,其中存储的是上一次广播发送者的状态信息。也就是说,在Sticky模式下,广播接收者能立即得到广播发送者的信息,而不用等到这一轮周期结束。其实就是系统会保存Sticky的广播[^①],当有新广播接收者来注册时,系统就把Sticky广播发给它。 以上我们对广播及广播接收者做了一些简单介绍,读者也可参考SDK文档中的相关说明来加强理解。 下面将以动态广播接收者为例,分析Android对广播的处理流程。 [^①]:由于系统内部保存了Stikcy广播,当一个恶意程序频繁发送这种广播时,是否会把内存都耗光呢?