Android 三种sendBroadCast的方式对比

本文深入探讨了Android应用中Intent的概念及其在进程间通信中的作用,并详细解析了sendBroadcast()、sendOrderedBroadcast()和sendStickyBroadcast()这三种广播发送方法的特性、区别以及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为android 的四大基本组件之一的 BroadCast Receiver,是进行进程间通信的重要手段,几乎所有的应用都会注册和发送各种不同的intent, 那么有一个问题,你是否了解Intent?  作为延伸,我们需要了解一下 sendBroadcast()  / sendOrderedBroadcast() sendStickyBroadcast() 这三个方法的不同。

1)sendBroadcast: 最普通的发送intent的方式,是一种无序的广播机制,理论上,所有的接受者同时获得该intent的消息, 接受者之间不存在先后顺序, 不能截断/修改intent的数据。 应用普遍使用的就是该方式。

2)sendOrderedBroadcast: 是有序的发送广播的机制,所有接受者都可以设置priority , 按照priority 的大小顺序进行传递, 上一个优先级的接受者,可以截断和修改intent里面的数据。 同时,也可以设置一个最后接收者(总是在最后一个接收到这个intent,用来做一些特定的功能)。

3)sendStickyBroadcast: 是一种粘性广播。所谓的粘性是指,这个intent 没有周期限制, 一般的intent 只能发送给当前已经注册了这个监听的receiver,一旦发送完毕就会失去作用周期,而粘性广播没有这个限制,即便后来注册的intent也可以收到这个广播。 需要注意的一点是 这种发送方式不会导致ANR, 因为它没有发送时间的限制。

4)android 4.2 之后加入了多用户,UserHandle.ALL  /  UserHandle.CURRENT  /  UserHandle.CURRENT_OR_SELF  /  UserHandle.OWNER

      这就造就了另外一个发送函数 sendBroadcastAsUser 用来区分不同的用户。

### Android 中广播的调用方法及其区别 #### 动态注册与静态注册的区别 在 Android 开发中,广播接收器可以通过动态注册或静态注册的方式实现。这两种方式的主要差异在于生命周期管理和触发条件。 对于 **静态注册** 的广播接收器,开发者需在 `AndroidManifest.xml` 文件中声明该组件,并指定其过滤意图的动作。这种方式使得应用程序即使未启动也能响应特定类型的广播消息[^3]: ```xml <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.MY_ACTION"/> </intent-filter> </receiver> ``` 而 **动态注册** 则是在代码运行期间通过编程手段完成注册过程,通常位于某个 Activity 或 Service 内部执行。相比而言,这类广播仅当关联的应用程序处于前台活动状态时才会生效[^1]: ```java // 在Activity或其他Context内 registerReceiver(new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent){ // 处理接收到的消息... } }, new IntentFilter("com.example.DYNAMIC_BROADCAST")); ``` #### 发送有序广播 vs. 普通广播 发送广播有两种主要形式——无序广播和有序广播。前者是一种异步机制,所有监听相同动作的接收者几乎同时获得通知;后者则是同步处理流程的一部分,允许按优先级顺序依次唤醒各个接收方并给予它们修改最终结果的机会[^4]。 - 对于 **普通广播**, 使用如下语句即可发出: ```java sendBroadcast(intent); ``` - 若希望发起一次 **有序广播**, 可采用下面的方法签名: ```java sendOrderedBroadcast(intent,null /*权限*/,null/*回调*/); ``` #### 广播与其他通信模式对比 值得注意的是,虽然广播提供了一种简单有效的跨进程通讯方案,但在某些场景下可能不是最优选择。例如,在模块间频繁交换数据的情况下,考虑到性能损耗以及潜在的安全隐患(如暴露过多内部接口),建议探索其他替代品,比如使用 AIDL (Android Interface Definition Language) 实现远程对象访问或是借助 EventBus 进行事件驱动型设计.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值