Android 7.0 ActivityManagerService 广播(Broadcast)相关流程分析

本文详细分析了Android 7.0中ActivityManagerService对不同类型的BroadcastReceiver(静态、动态)的处理流程,包括普通广播、有序广播和粘性广播的实现细节。探讨了限制广播发送范围的方法,以及BroadcastQueue如何管理广播队列。还特别讨论了BroadcastReceiver的超时处理和ANR问题,解析了onReceive函数超时的解决策略。
摘要由CSDN通过智能技术生成

参考:(Android 7.0 ActivityManagerService(5) 广播(Broadcast)相关流程分析

总结:

1. BroadcastReceiver的注册类型静态注册动态注册

2. 广播的种类

普通广播 
普通广播由发送方调用sendBroadcast及相关重载函数发送。

AMS转发这种类型的广播时,根据BroadcastReceiver的注册方式,进行不同的处理流程。 

  • 对于动态注册的广播,理论上可以认为,AMS将在同一时刻,向所有监听此广播的BroadcastReceiver发送消息,因此整体的消息传递的效率比较高。 
  • 对于静态注册的广播,AMS将按照有序广播的方式,向BroadcastReceiver发送消息

有序广播 
有序广播由发送方调用sendOrderedBroadcast及相关重载函数发送,是一种串行的广播发送方式。

处理这种类型的广播时,AMS会按照优先级,将广播依次分发给BroadcastReceiver。 
AMS收到上一个BroadcastReceiver处理完毕的消息后,才会将广播发送给下一个BroadcastReceiver。 
其中,任意一个BroadcastReceiver,都可以中止后续的广播分发流程。 
同时,上一个BroadcastReceiver可以将额外的信息添加到广播中。

前文已经指出,当普通广播发送给静态注册的BroadcastReceiver时,AMS实际上是按照有序广播的方式来进行发送

粘性广播 
粘性广播由发送方调用sendStickyBroadcast及相关重载函数发送。 
需要注意的是,目前这种广播已经被附上Deprecated标签了,不再建议使用。

粘性广播和有序广播等概念实际上不是冲突的。 
粘性仅仅强调系统将会保存这个广播,它的其它处理过程与上文一致。

3. 适时地限制广播发送范围

在某些场景下,这种设计也可能带来一些安全隐患: 
1.其它App可能会针对性的发出与当前App intent-filter相匹配的广播,导致当前App不断接收到广播并处理; 
2.其它App可以注册与当前App一致的intent-filter用于接收广播,获取广播具体信息。

因此,在必要的时候,需要适时地限制广播发送范围,例如: 

  1. 对于同一App内部发送和接收广播,将exported属性设置成false; 
  2. 在广播发送和接收时,都增加上相应的permission; 
  3. 发送广播时,指定BroadcastReceiver对应的包名。

实际上,在framework/support/v4/java/android/support/v4/content目录下,Android定义了LocalBroadcastManager类,用于发送和接收仅在同一个App应用内传递的广播


4. BroadcastQueue是负责添加broadcast,并处理broadcast的主要类。

其中包含两个队列,分别用于处理串行广播和并行广播。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值