broadcastreceiver详解(基础篇)

author author     2023-04-18     560

关键词:

参考技术A

Broadcast (广播)是一种广泛运用的应用程序之间传输信息的机制,而 BroadcastReceiver (广播接收器)则是用于接收来自系统和应用的广播对并对其进行响应的组件,Android中我们要发送的广播内容是一个 Intent ,这个 Intent 中可以携带我们要传送的数据

创建一个广播接收器非常简单,只需要继承 BroadcastReceiver ,并重写 onReceive() 即可

BroadcastReceiver 也是四大组件之一,所以我们也需要对 BroadcastReceiver 进行注册,不同于其他四大组件, BroadcastReceiver 有两种注册方式,分别是 静态注册 动态注册

静态注册

当我们的应用首次启动的时候,系统会自动实例化我们静态注册的 BroadcastReceiver ,然后将这个 BroadcastReceiver 注册到系统中,系统接收到广播之后,就会做出相应的判断,调用 onReceive() 方法。通过这种方式注册的广播,即使我们的应用被销毁,依然能收到广播。 这里要注意的是,我们的应用一定要被启动过 ,如果没有被启动可能就无法接收到广播,可以参考文章 Android应用在未启动的情况下无法收到指定广播的问题总结

正是因为静态注册耗电、占内存、不受程序生命周期影响,所以Google在Android 8.0上禁止大部分广播的静态注册,可以参考官文文档 Android 8.0 功能和 API

动态注册

通过动态注册的广播, BroadcastReceiver 的生命周期跟随Activity的生命周期

注意: 要在 Activity 的 onPause() 中 unRegeisterReceiver() ,否则会引起内存泄漏。比较推荐 onResume() 中去注册广播,在 onPause() 中去注销广播。因为在内存资源比较吃紧的情况下,可能我们的 Activity 执行完 onPause() 之后就被销毁,这时候 Activity 的 onStop() 和 onDestory() 方法就不会执行了

BroadcastReceiver注册完之后,这个 BroadcastReceiver 就能够接收响应的广播,下面我们来说说如何发送一条广播

普通广播(Normal Broadcast)

普通广播完全是异步的,通过 context.sendBroadcast() 方法发送,消息传递效率比较高,但所有接收器的执行顺序不确定。缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传播

有序广播(Ordered Broadcast)

有序广播是通过 context.sendOrderedBroadcast() 方法发送,所有的广播者按照优先级依次执行,广播接收器的优先级通过 receiver 的 intent-filter 中的 android:priority 属性来设置,数值越大优先级越高。当广播接收器接收到广播后,可以使用 setResult() 方法把结果传递给下一个接收者,通过 getResult() 方法获取上一个接收者传递过来的结果,并可以通过 abortBroadcast() 方法丢弃该广播,使该广播不再传递给下一个接收者

粘性广播(Sticky Broadcast)

粘性广播通过 context.sendStickBroadcast() 方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得 BROADCAST_STICKY 权限

由于在Android5.0 & API 21中已经失效,所以不建议使用。

本地广播(Local Broadcast)

前三种广播都是全局广播,所有应用都可以接收到,这样就带来安全隐患,而本地广播只在进程内传播,可以起到保护数据安全的作用

其实,本地广播的使用与其十分类似,之前的步骤均是一样的,调用者不同而已,本地广播调用的是 LocalBroadcastManager 相关方法,全局广播调用的是 Context 的相关方法,其方法名都是一样的

这里需要说一下, 使用本地广播并没有静态注册的方法 ,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,而发动本地广播的时候,我们的程序已经是启动了,所以,自然是没有静态注册这个方法

Android中内置了多个系统广播,当使用系统广播时,只需要在注册广播接收者时定义相关的 action 即可,并不需要手动发送广播,当系统有相关操作(如开机、网络状态变化、拍照等等)时会自动进行系统广播

Android系统广播 action 如下:

本文介绍了 BroadcastReceiver 的两种注册方式(动态注册、静态注册),四种发送方式(普通广播、有序广播、粘性广播(API21废弃)、本地广播),以及系统广播的用法。几乎涵盖了 BoradcastReceiver 在应用开发过程中的所有知识,对于BroadcastReceiver原理感兴趣的可以继续看 BroadcastReceiver详解(原理篇)

[基础漏洞篇]webpack前端源码泄露详解

   查看详情

rk3568平台开发系列讲解(驱动基础篇)makefile详解

查看详情

vue.js基础知识篇:组件详解

第11章:组件详解 组件是Vue.js最推崇也最强大的功能之一,核心目标是可重用性。我们把组件代码按照template、style、script的拆分方式,放置到对应的.vue文件中。1.注册Vue.js的组件注册分为全局注册和局部注册。全局注册使用Vu... 查看详情

vue.js基础知识篇:表单校验详解

目录网盘第12章:表单校验1.npm安装vue-validator$npminstallvue-validator代码示例:varVue=require("vue");varVueValidator=require("vue-validator");Vue.use(VueValidator);2.直接使用script标签引入vue.js要下载vue-validator,那么进入cdn的地址http 查看详情

rk3568平台开发系列讲解(驱动基础篇)mmap系统调用详解

查看详情

elasticsearch检索分类深入详解—基础篇

转载自服务号【铭毅天下】Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。有了数据后,我们就需要对数据进行检索操作。根据实际开发需要,往往我们需要支持包含但不限于以下... 查看详情

android基础篇监听home键(代码片段)

一、Home键监听工具类importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentFilter;importcom.blankj.utilcode.util.LogUtils;publicclassHom 查看详情

java基础之变量详解

前言上一篇我们讲的是java基础之常量及数据类型,包括定义,代码,演示和总结。这一篇接着给大家带来,java基础之变量和数据类型,变量到后面大家工作的时候也都会频繁用到,所以大家看得时候一定要实操一下,本篇和上... 查看详情

nginx详解五:nginx基础篇之http请求

  HTTP请求请求百度看一下:curlhttp://www.baidu.com这样的格式不能直观的查看和分析,加个-v来展现出每次请求的具体的信息内容,然后把返回的信息重定向到一个空设备上面,便于查看curl-vhttp://www.baidu.com>/dev/null  查看详情

100天精通python丨基础知识篇——04变量和基础数据类型详解

《100天精通Python专栏-快速入门到黑科技》是由CSDN内容合伙人丨全站排名Top4的硬核博主不吃西红柿倾力打造,专栏分为基础知识篇和黑科技应用篇。基础知识篇以理论知识为主,旨在帮助没有语言基础的小伙伴,学习我整理成体... 查看详情

基础篇:4.1)规范化:3d工程图纸出图步骤详解

本章目的:按照工程图出图步骤,顺利制造规范的工程图。 2.工程出图步骤以solidworks为例:0)打开绘制的3d零件图,进行3d图的GB基础设置;1)3d零件图(装配体图)转为工程图,进行工程图GB基础设置;2)选定合适图幅和比例... 查看详情

[基础漏洞篇]webpack前端源码泄露详解(代码片段)

  🍬博主介绍 👨‍🎓博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~✨主攻领域:【渗透领域】【数据通信】【通讯安全】【web安全】【面试分析】🎉点赞➕评论➕收藏==养成习... 查看详情

android四大组件系列篇

文章目录1、Activity2、Service3、BroadcastReceiver4、ContentProvider1、ActivityActivity(一)Activity间的跳转Activity(二)Activity间的传值Activity(三)生命周期详解2、ServiceService(一& 查看详情

vue2.0深入源码分析基础篇methods属性详解(代码片段)

用法 methods中定义了Vue实例的方法,官网是这样介绍的:例如::<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><scriptsrc="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>< 查看详情

vue2.0深入源码分析基础篇computed属性详解(代码片段)

用法模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护,比如:<divid="example">message.split(‘‘).reverse().join(‘‘)</div><script>varapp=newVue(el:‘#example‘,data:... 查看详情

android的四大基础----service篇

   android中有四大组件:Activity,Service,BroadcastReceiver和ContentProvider。其中Service级别上跟Activity其实差不多,只是Service只能在后台运行,适合那些不需要界面的操作,像是播放音乐或者监听动作等,因为它的名... 查看详情

android基础到进阶面试题之broadcastreceiver使用+实例(代码片段)

BroadcastReceiver是什么        BroadcastReceiver是Android四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据。BroadcastReceiver使用场景应用内多个不同组件之间的消息通信。跨应用... 查看详情

详解autosar:autosra软件架构(理论篇—2)

目录1、应用软件层2、运行时环境3、基础软件层3.1、服务层3.2、ECU抽象层 查看详情