一、广播的简介

首先,当我们一听到广播这个词时。就可以想到小学是教室的广播。不错Android中的广播机制与我们生活中的广播是有异曲同工之妙的。Android中的发送广播也就像广播室播广播,可以让很多注册过广播的地方收到这条广播。接下来我们对其进行分析。

二、广播的发送

广播的发送主要是分为2种,分别是普通广播(Normal broadcasts)和有序广播(Ordered broadcasts)。他们之间的不同点如下所示 :

普通广播(Normal broadcasts)
普通广播采用的是Context.sendBroadcast()发送的。
普通广播是完全异步的,他可以在同一时刻(逻辑上)被所有注册了的接收者接收到,消息传递的效率比较高,就像教室的广播一样,当发送广播时所有开了广播的教室等会同时收到。但这种方式的缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;

有序广播(Ordered broadcasts)
有序广播是采用Context.sendOrderedBroadcast()发送的
然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。就相当于公司领导发通知肯定是不会直接到员工手上的,需要先到部门老大那然后部门老大再告诉你,部门老大可以选择不告诉你或者增加一些信息然后通知你。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。中间优先级高的也可以将广播拦截,这样优先级低的就无法收到了。

Demo分析
首先我们先来看一下普通广播的发送

public class MainActivity extends AppCompatActivity {Button button;public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(ACTION_INTENT_TEST);sendBroadcast(intent);}});}
}

上面是一个按钮点击事件然后发送,接下来我们制作一个接收广播的类

public class MyReceiver extends BroadcastReceiver {private static final String TAG = "MyReceiver";public MyReceiver(){Log.d(TAG, "MyReceiver: ");}@Overridepublic void  onReceive(Context context, Intent intent) {Log.d(TAG, "onReceive: ");}
}
 <receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.terry.broadcast.test"></action></intent-filter></receiver>

我们这里是先制作了一个类来接收,然后再AndroidManifest中注册这个广播设置 也就是我们发送是intent携带的。他会去匹配有这个intent-filter的广播。我们看Log信息

就这样这个普通广播就接收到了,我们就可以再onReceive中做我们想做的操作。我们可以这个来进行全局的操作。

那么问题来了,Android 如何判断并筛选广播?

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

我们正是在<intent-filter> <action android:name="com.terry.broadcast.test"></action> </intent-filter>中设置筛选的。然后发送时携带它

Demo分析二有序广播
我们上面不变,然后同样的创建再创建一个广播。唯一的差别就是AndroidManifest的设置不同。然后我们采用Context.sendOrderedBroadcast()的发送方式

<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter android:priority="100"><action android:name="com.terry.broadcast.test" /></intent-filter></receiver><receiverandroid:name=".MyReceiver2"android:enabled="true"android:exported="true"><intent-filter android:priority="200"><action android:name="com.terry.broadcast.test" /></intent-filter></receiver>

很明显可以看到广播二的priority="200"是200而第一个是100,所以这个的优先级比100的高它会先接收。我们看Log

确实广播二比广播一先接收到
那么我们要怎么截断数据呢那便是在优先级高的广播onReceived中添加代码
**abortBroadcast();**就OK了我们来看Log

确实拦截了。

小结:
在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
使用广播必须要有一个intent 对象必设置其action动作对象
使用广播必须在配置文件中显式的指明该广播对象
每次接收广播都会重新生成一个接收广播的对象
在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
如果在AndroidManifest.xml中注册,当应用程序关闭的时候,也会接收到广播。在应用程序中注册就不产生这种情况了。

下面自己来看一下如何在应用程序中注册BroadcastReceiver

利用代码注册 BroadcastReceiver 时有以下步骤:

1)生成一个 BroadcastReceiver 对象;

2)生成一个 IntentFilter 对象;

3)为 IntentFilter 对象添加一个 Action ;

4)利用 IntentFilter 和 BroadcastReceiver 绑定注册一个 BroadcastReceiver 到系统中,当系统广播发出Action事件的时候,就会匹配到该BroadcastReceiver。然后执行 onReceive方法,我们可以在里面写我们需要做的事,如网络变动、开机启动之类的。

Android广播机制源码下载,里面有更详细的内容

Android 广播机制详解相关推荐

  1. Numpy的广播机制详解(broadcasting)

    Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...

  2. Android学习笔记——Android 签名机制详解

    Android 签名机制详解 近期由于工作需要在学习 Android 的签名机制,因为没有现成资料,只能通过开发者文档和阅读博客的方式对 Android 签名机制进行大致了解.过程中查阅到的资料相对零 ...

  3. 【Android签名机制详解】二:Android V1、V2、V3、V4签名方案

    前言 书接上回[Android签名机制详解]一:密码学入门,在了解了消息摘要.非对称加密.数字签名.数字证书的基本概念后,我们趁热打铁.直奔主题,讲解签名在Android中的实际应用. 基础知识 An ...

  4. Android Intent机制详解

    什么是Intent  Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...

  5. BroadcastReceiver 广播机制详解

    BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播. 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产 ...

  6. Android 消息机制详解(Android P)

    前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...

  7. Android事件机制详解

    转自:http://www.codeceo.com/article/android-event.html 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和事件机制,前者用于跨 ...

  8. Android消息机制详解

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 Android消息机制 这一定是一个被写烂了的专题吧.那本媛也来凑一个热闹吧.哈哈 这篇博客将会涉及以下内容: 消息机制概述 UM ...

  9. Android运行机制详解

    Android应用程序是用Java语言写的,通过aapt工具把应用程序所需要的任何数据.资源文件打包成apk文件,这个文件是一个将应用安装到手机上的一个载体. 每个android应用程序存在于不同的世 ...

最新文章

  1. VC操作Excel文件编程相关内容总结
  2. 为什么应该学习Kotlin
  3. mysql的默认sid_默认实例(SID)已经设置,空实例默认连接时却连接不上?
  4. macos server 恢复安装_如何通过 macOS 恢复功能重新安装 macOS
  5. Maven多工程项目
  6. linux 创建目录和删除目录
  7. 文献检索是利用计算机对文献,文献检索计算机课.ppt
  8. 最好的录屏软件 WebEx Recorder Editor
  9. 裁员潮,互联网寒冬的黑暗时刻
  10. 故障树FTA(fault tree analysis)工具链
  11. C++之相对路径转绝对路径
  12. Apollo决策技术分享
  13. 电子稳定程序系统--ESP
  14. vue全套教程(实操)
  15. java调用快递物流接口api
  16. 【Python数据分析 :Task4】
  17. 华为路由器 IPSec VPN 配置
  18. 网易163邮箱开通smtp邮件协议后用python发邮件
  19. React学习笔记之运行错误解决办法(不定时更新)
  20. c++ web 框架 ---ricky.chu

热门文章

  1. 从天上吵到地下,马斯克和贝佐斯究竟什么仇什么怨?
  2. Python使用numpy获取列表行数、列数
  3. 断网攻击以及简单木马制作
  4. 华为Mate40系列售价公布
  5. ShaderForge-火焰溶解
  6. win10自带的便笺便签有哪些方便快捷的操作小技巧?
  7. wxpython日期控件_[Python] wxPython 基本控件 (转)
  8. 自习室预约小程序,共享自习室系统
  9. Solidify实现一个智能合约3(单继承与多继承)
  10. 手机学python语言用什么软件好_手机上学python的软件_零基础自学python的APP_手机学python的app_东坡下载...