Android 广播机制 详解

Android广播机制详解与应用实践 广播(Broadcast)是Android四大组件之一,采用发布-订阅模式实现跨进程通信。其核心原理是通过Intent匹配机制,将事件通知分发给注册的接收器(BroadcastReceiver)。广播机制在系统事件监听、应用间通信等场景具有重要技术价值,特别是处理电量变化、网络状态等系统级事件时尤为高效。随着Android版本迭代,广播机制经历了从宽松到严格的使用限制,开发者需要掌握静态注册与动态注册的区别,了解有序广播的优先级控制技巧。在实际开发中,合理使用LocalBroadcastManager可以优 阅读详情

从现实生活中理解广播机制

一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的。收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同。接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理。好比我们收听交通电台的广播,电台中告诉我们现在在交通状况如何,但它并不关心我们接收到广播时做如何做出处理,这不是广播应该关心的问题,OK,到这里我们从生活中的一些小例子浅浅的理解了一下广播,那么Android 中的广播是如何操作的呢?

Android 的广播机制

在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。下面我画一张粗略的图来帮助大家理解广播的运行机制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PaUTNRnj-1651210155786)(http://hi.csdn.net/attachment/201108/8/0_1312771509ffB0.gif)]

Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFi 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 lter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,通过代码:Bundle bundle =getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

系统收到短信,发出的广播属于有序广播。如果想阻止用户收到短信,可以通过设置优先级,让你们自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。

案例分析:

一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等。。。

Demo 分析:

下面通过一个小DEMO 来讲解一下广播在Android 中如何编写,在Demo中我们设置了一个按钮为按钮设置点击监听通过点击发送广播,在后台中接收到广播并打印LOG信息。代码如下:

public class BroadCastActivity extends Activity {

/** Called when the activity is first created. */

public static final String ACTION_INTENT_TEST = “com.terry.broadcast.test”;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button btn = (Button) findViewById(R.id.Button01);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ACTION_INTENT_TEST);

sendBroadcast(intent);

}

});

}

}

接收器代码如下:

public class MyBroadCast extends BroadcastReceiver {

public MyBroadCast() {

Log.v(“BROADCAST_TAG”, “myBroadCast”);

}

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

Log.v(“BROADCAST_TAG”, “onReceive”);

}

}

Android 广播的生命周期

在上面的接收器中,继承了BroadcastReceiver 并重写了它的onReceive 并构造了一个函数,下面通过图片来一步一步认识 Android 广播的生命周期。当我点击一下按钮,它向Android 发送了一个广播,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U6HzdEPn-1651210155787)(http://hi.csdn.net/attachment/201108/8/0_1312772331aM1d.gif)]

这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIoKhXpJ-1651210155788)(http://hi.csdn.net/attachment/201108/8/0_1312772384IhuK.gif)]

下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaDD4sE9-1651210155788)(http://hi.csdn.net/attachment/201108/8/0_1312772415Bx82.gif)]

下面来看一下SDK给出的解释:

大意为:如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。

至此,大家应该能明白 Android 的广播生命周期的原理,代码也不用多介绍,很简单的一个发送广播并处理广播的Demo。

Android 如何判断并筛选广播?

前面说过 Android 的广播有各式各样,那么Android 系统是如何帮我们处理我们需要哪种广播并为我们提供相应的广播服务呢?这里有一点需要大家注意,每实现一个广播接收类必须在我们应用程序中的 manifest 中显式的注明哪一个类需要广播,并为其设置过滤器,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oUM8GIIj-1651210155789)(http://hi.csdn.net/attachment/201108/8/0_1312773489R491.gif)]

Tip:action 代表一个要执行的动作,在Andriod 中有很action 比如 ACTION_VIEW,ACTION_EDIT

那么有些人会问了,如果我在一个广播接收器中要处理多个动作呢?那要如何去处理?

在Android 的接收器中onReceive 以经为我们想到的,同样的你必须在Intent-filter 里面注册该动作,可以是系统的广播动作也可以是自己需要的广播,之后你之需要在onReceive 方法中,通过intent.getAction()判断传进来的动作即可做出不同的处理,不同的动作。具体大家可以去尝试测试一下。

小结:

  • 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。

  • 使用广播必须要有一个intent 对象必设置其action动作对象

  • 使用广播必须在配置文件中显式的指明该广播对象

  • 每次接收广播都会重新生成一个接收广播的对象

  • 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
    中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。**

  • 使用广播必须要有一个intent 对象必设置其action动作对象

  • 使用广播必须在配置文件中显式的指明该广播对象

  • 每次接收广播都会重新生成一个接收广播的对象

  • 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集) 本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。 阅读详情

相关推荐

吃透工业通信:C#工控机实现Modbus、OPC UA、Profinet、EtherCAT协议全适配

本文介绍了基于C#的工业通信协议全适配方案,采用分层架构设计实现Modbus、OPC UA、Profinet和EtherCAT四种主流协议的统一管理。核心包括:1)三层架构(应用层、抽象层、协议层)降低耦合;2)定义统一通信接口IIndustrialCommunication;3)工厂模式创建不同协议实例;4)以Modbus TCP为例展示具体实现。该方案经过实际项目验证,可简化多协议设备管理,提升工业自动化系统的开发效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 663

Android——广播机制原理

一、广播类型 Andriod 中的广播主要分为两个类型:标准广播和有序广播。 标准广播(Normal broadcasts)是一种完全异步执行的广播。在广播发送后,所有的广播接收器都可以在同一时刻接收到这条广播信息,然后各自进行相应的逻辑处理。标准广播的优点是效率高,当与此同时,也意味着标准广播是无法被截断的,所有的广播接收器都可以接受到。标准广播示意图如下: 有序广播(Ordered broadcasts)是一种同步执行的广播。在广播发出后,同一时间只能有一个优先级最高的广播接收器来接收。.

qq_39790633的博客 4454

PhaseFieldModel_Umat断裂_相场_断裂_相场;断裂_相场断裂_

算例为一个双刃端口二维板,采用相场断裂计算模型计算,即该UMAT子程序

Android基础知识——详解广播机制

文章目录1.广播机制简介2.接受系统广播2.1动态注册广播2.2静态广播注册3.发送自定义广播3.1发送标准广播3.2发送有序广播4.使用本地广播 1.广播机制简介 当android手机的状态发生变化时,系统就会发送一条广播,而开发者则可以自定义广播接收器来接受自己所需的广播,从而执行一些逻辑代码(例如:当手机电量剩余15%时,提示用户是否进入省电模式),另外不止系统可以发送广播,开发者也可以自定义发送广播。 而广播则主要分为两种类型:标准广播,有序广播。 标准广播:一种完全异步执行的广播,在广播发送后,所

ABded的博客 1553

【15】应用开发——Broadcast广播机制

Android广播机制是观察者模式在Android系统中的一种实际应用,它允许应用程序在接收到特定的广播后执行某些操作。其中,发送广播是通过Intent来实现的,接收广播是通过BroadcastReceiver广播接收器来实现的。Android广播的类型有两种,他们分别是:①标准广播 ②有序广播

熊熊饲养员的CSDN! 2295

Android总结篇系列:Android广播机制

1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间); 2.同一app内部的不同组件之间的消息通信(单个进程); 3.同一app具有多个进程的不同组件之间的...

weixin_33989780的博客 901

Android广播机制详解

1 广播类型 从广播的注册方式来分,分为以下2种: (1)静态广播:通过的形式在AndroidManifest.xml中注册的广播; (2)动态广播:通过context. registerReceiver在程序中显示注册的广播; 上面静态广播和动态广播比较明显的2个区别:    1)静态广播在进程没有运行的时候,也可以收到,这时候会先启动进程,然后处理广播onReceive函数(静态广播

houliang120的专栏 1万+

详解Android广播机制

谨以文章记录学习历程,如有错误还请指明。 前言 我们上学时都有过这样的经历,当我们在火车站列车候车室中等待时,每当有某次列车开始检票或者进站上车时,就会播放通知来告知在候车室等待的人们该消息。 为了便于进行系统级别的消息通知,Android引入了一套类似的广播机制,然而比上述情景要灵活得多。此文将对Android广播机制的方方面面做出详尽的介绍。 Android广播机...

whdAlive 's blog 5393

Android——详解广播机制

1.1广播机制简介 为了便于进行系统级别的广播通知,Android引入了一套广播消息机制Android的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序只会接收到自己所关心的广播内容,这些广播可能是来自系统的,也可能是来自其他应用的,Android提供了一套完整的API,允许应用程序自由地接受和发送广播接受广播的方法引入一个新概念——广播接收器(Broadcast Receiver)。 广播主要分为两种类型,标准广播,有序广播。 标准广播:是一种完全异步执行的广播,在广播发出后,所有的广播几乎

xuan的博客 1145

Android 广播机制 详解,行业寒冬

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

1169

Android 广播机制详解

一、广播的简介 首先,当我们一听到广播这个词时。就可以想到小学是教室的广播。不错Android中的广播机制与我们生活中的广播是有异曲同工之妙的。Android中的发送广播也就像广播室播广播,可以让很多注册过广播的地方收到这条广播。接下来我们对其进行分析。 二、广播的发送 广播的发送主要是分为2种,分别是普通广播(Normal broadcasts)和有序广播(Ordered broadcasts)...

晚茜的博客 3万+

Android 广播机制 详解,准备Android面试

案例分析: 一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等。。。 Demo 分析: 下面通过一个小DEMO 来讲解一下广播Android 中如何编写,在Demo中我们设置了一个按钮为按钮设置点击监听通过点击发送广播,在后台中接收到广播并打印LOG信息。代码如下: public class BroadCastActivity extends Activity { /**

m0_64319298的博客 420

Android四大组件之广播机制

Android中的广播主要可以分为两种类型:标准广播和有序广播。标准广播(normal broadcasts)是一种完全异步执行的广播,BroadcastReceiver 之间没有任何先后顺序。这种广播的效率会比较高,但同时也意味着它是无法被截断的有序广播(ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻 只会有一个BroadcastReceiver能够收到这条广播消息,当这个BroadcastReceiver中的 逻辑执行完毕后,广播才会继续传递。

晨猫 1209

Android广播的基本原理

Android广播的基本原理,具体实现流程要点粗略概括如下: 1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册; 2.广播发送者通过binder机制向AMS发送广播; 3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到Broa...

dalong3976的博客 3308

Android广播详解

Android系统粘性广播一般用来确保重要的状态改变后的信息被持久保存,并且能随时广播给新的广播接收器,比如电源的改变,因为耗电需要一个过程,前一个过程必须提前得到,否则可能遇到下次刚好接收到的广播后系统自动关机了,随之而来的是kill行为,所以对某些未处理完的任务来说,后果很严重。如果想要接受这些广播,就需要使用广播接收器。顾名思义,一种有序的,同步的广播,它是按照次序来传递,先被优先级高的接收器接收到,响应完成后再传递给接收器B然后C,同时可以进行截断,比如在A处截断,后续B和C就无法接收到广播

weixin_40323532的博客 4569

Android广播机制实现源码浅析(一)

Android系统的广播机制应用非常的广泛,是一种方便快捷的进程间通信的方式。同时它也有一些很有特殊的使用方式,比如它的两种注册方式,三种类型的广播等,这些充斥在整个系统框架中,那么为了用好广播,很有必要对其源码进行分析,从而避免一些低级失误。 本文将对整个广播机制涉及到的知识做个粗略的讲解,为大家自学抛砖引玉。 首先我们从注册当时入手,牵引出与本机制有关的一些类:Packageman

hehui1860的专栏 2308
上一篇: Android “退一步”的布局加载优化
下一篇: Android 来去电监听,电话挂断
Java364102
博客等级 码龄4年 12粉丝 58原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值