BroadcastReceiver 之有序广播

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更效! 阅读详情

Broadcast 被分为如下两种:

  1. Normal Broadcast (普通广播) : Normal Broadcast 是完全异步的,可以在同一时刻(逻辑上)被所有的接收者收到,消息传递的效率比较高. 但是缺点是不能将处理结果传递给下一个接收者,并且无法终止 Broadcast Intent 的传播.
  2. Ordered Broadcast (有序广播) Ordered Broadcast 的接收者将按预先声明的优先级依次接受 Broadcast . 如A的级别高于B,B的级别高于 C ,那么 Broadcast 先传给A ,再传给 B, 最后传递给 C .优先级别声明在 (intent-filter…/)标签中 android:priority=”Xxx” Xxx的数值越大优先级越高,取值范围是 -1000~~~1000,优先级别也可以调用 IntentFilter对象的setPriority( )进行设置.Ordered Broadcast 接收者可以终止 Broadcast Intent 的传播. Broadcast Intent 的传播.一旦终止,后面的接收者无法接收到 Broadcast . 另外 rdered Broadcast的接收者,可以将数据传递给下一个接收者, 如 A 得到 Broadcast 后,可以往它的结果对象中存入数据,当 Broadcast 传给 B时,B 可以从A 的结果对象中,得到 A 存入的数据.

Context 提供如下两个方法 用于发送广播.

  1. sendBroadcast ( ): 发送 Normal Broadcast
  2. sendOrderedBroadcast ( ): 发送 Ordered Broadcast

对于 Ordered Broadcast来说,系统会根据接收者声明的优先级别按顺序逐个执行接收者,优先接受到的 Broadcast 的接收者,可以终止 Broadcast,调用 BroadcastReceiver的 abortBroadcast()方法即可终止 Broadcast.如果 Broadcast被前面的接收者终止,后面的接收者再也无法
获取到Broadcast.


对于 Ordered Broadcast来说 优先接受到的 Broadcast 的接收者,可以通过setResultExtras(Bundle) 方法将处理结果存入 Broadcast中,然后传递给下一个接收者,下一个接收者通过代码 Bundle budle = getResultExtras(true) 可以获取上一个接收者存入的数据.


package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.test.broadcastreceiverdemo.R;

/**
 * 有序广播 OrderBroadcast
 */
public class SortedBroadcastActivity extends AppCompatActivity {

        Button send;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_sorted_broadcast);

            send = (Button) findViewById(R.id.order_button);


            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //创建 intent 对象
                    Intent intent = new Intent();
                    //设置Intent 的action 属性
                    intent.setAction("com.test.broadcastreceive.ORDERED_BROADCAST");

                    //设置数据
                    intent.putExtra("msg", "简单消息");

                    //发送广播
                    sendOrderedBroadcast(intent,null);
                }
            });
        }

}

第一个 Receiver 广播接收者

package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyOrderedReceiver extends BroadcastReceiver {
    public MyOrderedReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "接收到的Intent 的action 为: " + intent.getAction() +
                "\n 消息内容为: " + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();

        //创建一个 Bundle对象 并存入数据
        Bundle bundle = new Bundle();

        bundle.putString("first", "第一个BroadcastReceiver 存入数据 1");

        //将 bundle 放入结果中
        setResultExtras(bundle);

        //取消 Broadcast 的继续广播
     //   abortBroadcast();
    }
}

第二个 Receiver 广播接收者

package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyOrderedReceiver2 extends BroadcastReceiver {
    public MyOrderedReceiver2() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        Bundle bundle = getResultExtras(true);

        //解析上一个 BroadcastReceiver 所存入的key 为 first的消息
        String first = bundle.getString("first");

        Toast.makeText(context, "第一个Broadcast存入的消息 为: 2" + first, Toast.LENGTH_SHORT).show();

    }
}
Android-broadcastReceiver调度与管理--广播队列、有序广播与Sticky广播机制 Android广播机制深度解析:系统架构与核心流程 摘要:本文详细剖析了Android广播系统的核心架构,包括BroadcastReceiver组件在AMS中的双队列管理机制(前台/后台队列),以及有序广播、粘性广播等不同类型的实现原理。重点分析了广播发送流程,从ContextImpl.sendBroadcast()到AMS的broadcastIntentLocked()方法,涵盖权限验证、系统保护广播处理、粘性广播管理等关键环节。通过类关系图和广播类型对比表,系统性地展示了Android广播机制的设计思想 阅读详情

相关推荐

Android中BroadcastReceiver(异步接收广播Intent)的使用

Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很。 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收

android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题...

最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能。当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新,但是在广播接收器里面的某个步骤进行了再次发送通知的操作,发现该广播接收器变成了一个死循环的执行。经过仔细检查,发现没有任何一处用错action。  最将该广播接收器里面的发送广播语句注释,死循环不在...

weixin_34008805的博客 540

Error receiving broadcast Intent { act=ACTION_UPDATE_FAVORITE_IMAGE flg=0x10 (has extras) } in

Error receiving broadcast Intent { act=ACTION_UPDATE_FAVORITE_IMAGE flg=0x10 (has extras) }

u012452490的博客 3万+

Android Framework | 读懂异常调用栈

本文属于一个很小的知识点。但再小的知识点,都有值得深挖的必要。只有一次次深入地挖凿,才能构筑起坚实的技术堡垒。作者:卢半山原文链接:(https://juejin.cn/post/7154301024482623519)如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

star_nwe的博客 2217

android Error receiving broadcast

Error receiving broadcast Intent { act=com.fhtgps.fenghuotai.tcpbroadcast (广播接收器接收失败 1、广播发送的传值不正确,parceable接口没写正确,简单点直接实现序列化

鑫的专栏 3181

广播Error receiving broadcast Intent { act=com.supersdk.listen.PayListen_defeat flg=0x10 (has extras)

发送广播后跳转activity问题折腾了一天. 一开始以为是广播发重复了.没解决. 然后看到了Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 生命周期的问题.知道了原因 广播发送后activity在某种场景下处于被kill 掉的边缘,系统就...

kaifei2018的博客 9305

BroadcastReceiver普通广播有序广播、拦截广播、本地广播、Sticky广播、系统广播

BroadcastReceiver翻译为广播接收者,Broadcast是一种广泛运用在应用程序之间的传输信息的机制,简单的可以理解为传统意义上的电台广播,通俗一点,发布失物招领 广播机制是一个典型的发布—订阅模式,也就是我们所说的观察者模式。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合 普通广播 普通广播是完全异步的,通过Context的sendBroadcast()方法来发送,消息传递效率比较,但所有receiver

豆子的博客 1183

Android的Service与BroadcastReceiver之四 BroadcastReceiver 简介、开发与配置;发送广播有序广播;使用BroadcastReceiver接受系统广播

BroadcastReceiver 简介、开发与配置 本质上就是一种全局监听器,用于监听全局的广播消息。它可以非常方便地实现系统中不同组件之间的通信 BroadcastReceiver用于接收程序锁发生的Broadcast Intent,启动BroadcastReceiver只需要两步 创建需要启动的BroadcastReceiver的Intent调用Context的sendBroa

编程问题与思索 687

安卓BroadcastReceiver组件使用系列2:给多个广播接收者发送广播有序广播的使用

给多个广播接收者发送广播有序广播的使用在安卓开发中是经常使用的方式,下面我们来介绍一下它的使用方法。 整体思路:在xml文件中放置两个Button控件,给这两个Button控件设置点击事件,在第一个点击事件中传递一个数据,设置一个动作并发送广播,在第二个点击事件中传递一个数据,设置一个动作并发送有序广播。新建三个继承BroadcastReceiver广播接收类,用于接收传递的数据。在第二个B

luoshiwutai的博客 2731

android-BroadcastReceiver 发送有序广播

普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Ordered Broadcast): 一,优缺点 优点:1,按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver              2,通过abortBroadcast可终止广播的传播

superjunjin的专栏 1万+

BroadcastReceiver的使用--普通广播有序广播

BroadcastReceiver(广播接收器)本质上就是一个全局监听器,用于监听系统全局的广播消息,它拥有自己的进程,只要存在与之匹配的Intent被广播出来,就会被激发。值得注意的是Android8要求启动BroadcastReceiver的Intent必须是显性(设置Action和package)。 广播分为普通广播(sendBroadcast)有序广播(sendOrderedBroadcast)。 普通广播:完全异步,可以在同一时刻被所有接收者接收到。 有序广播:按照预先声...

qq_50272406的博客 767

发送有序广播——BroadcastReceiver

有序广播(Ordered Broadcast): 一,优缺点 优点:1,按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver       2,通过abortBroadcast可终止广播的传播   缺点:效率低   二,发送广播的方法:sendOrderedBroadcast()    三,

ly1012053441的博客 665

初学Android BroadcastReceiver有序广播 七十一

初学Android BroadcastReceiver有序广播 七十一

hffyyff的博客 352

BroadcastReceiver有序广播

有序广播可以按一定的优先级进行传播 首先进行发送广播 public void click(View v){ Intent intent = new Intent(); intent.setAction("com.coderwei.orderbroadcast"); sendOrderedBroadcast(intent,null,n...

weixin_30684743的博客 97

BroadCastReceiver有序广播和EventBus

BroadCastReceiver有序广播和EventBus有序广播粘性广播代码片段EventBus 有序广播 步骤: 注册()多个receiver要使用同一个action) priority来指定优先级 发送有序广播 sendOrderedBroadcast(intent,null); 常用方法 setResultExtras(Bundle对象)设置携带数据 getResultExtras(tr...

wangzhen的博客 488

Android四大组件之BroadcastReceiver---普通广播有序广播广播注册以及注意事项

BroadcastReceiver两种发送方式 广播BroadcastReceiver被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。 普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播; 有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,

奋斗的左撇子 1036

android 有序广播 如何终止,78 Android BroadcastReceiver 有序广播_ 优先级_终止广播

新建三个BroadcastReceiverOne extends BroadcastReceiverOne.javapackage com.example.android_broadcast_order;import android.content.BroadcastReceiver;import android.content.Context;import android.content.I...

weixin_35792468的博客 329

Android学习笔记(十二)BroadcastReceiver有序广播优先级

  前两篇博文中简单整理了普通广播,其实还有有序广播有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等。 一、两种Broadcast:   · 普通广播(Normal Broadcast):用sendBroadcast()方法发送。   普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到,消息传递效率,缺点是接受者...

anxiushang5448的博客 569
上一篇: BroadcastReceiver 广播接收者
下一篇: 基于Service的音乐盒
高锦湖
博客等级 码龄11年 11粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值