【四大组件】-- 广播接收器 BroadcastReceiver

目录

  • 广播接收器 BroadcastReceiver
    • 实现原理
    • 使用流程
    • 广播的类型
      • (1) 普通广播
      • (2) 系统广播
      • (3) 有序广播
      • (4) App应用内广播 Local Broadcast
      • 粘性广播
    • 面试问题

广播接收器 BroadcastReceiver

实现原理

Android 中的广播使用了设计模式中的观察者模式: 基于消息的发布/订阅事件模型。
模型中有3个角色:

  1. 消息订阅者( 广播接收者)
  2. 消息发布者( 广播发布者)
  3. 消息中心( AMS , 即 Activity Manager Service )
    原理描述:
  4. 广播接收者 通过 Binder 机制在 AMS 注册
  5. 广播发送者 通过 Binder 机制向 AMS 发送广播
  6. AMS 根据 广播发送者 要求, 在已注册列表中, 寻找合适的广播接收者,寻找依据: IntentFilter / Permission
  7. AMS 将广播发送到合适的广播接收者相应的消息循环队列中;
  8. 广播接收者通过 消息循环 拿到此广播, 并回调 onReceive()
    特别注意: 广播发送者 和 广播接收者的执行 是 异步的, 发出去的广播不会关心有无接收者接收, 也不确定接收者到底是何时才能接收到;

使用流程

  1. 自定义广播接收者
    继承自BroadcastReceiver类,
    重写抽象方法onReceive(Context ctx, Intent intent)方法:默认情况下, 广播接收器运行在UI线程, 因此, onReceive方法不能执行耗时操作, 否则将导致ANR。
  2. 注册广播接收器
    静态注册:在AndroidManifest.xml里通过标签receiver声明,当此App首次启动时, 系统会自动实例化自定义广播接收器类, 并注册到系统中。
    动态注册:在某一个组件的代码中通过调用Context的registerReceiver(BroadcastReceiver, IntentFilter)方法进行动态注册。对于动态广播, 有注册就必然得有注销, 否则会导致内存泄露。

两种注册方式的对比:
静态注册:常驻,不受任何组件的生命周期影响,缺点是耗电,占内存。
动态注册:非常驻,灵活,跟随组件的生命周期变化,在组件结束前,必须移除广播接收器。
3. 广播发送者向AMS发送广播
广播的发送:广播是用Intent标识的,定义广播所具备的Intent,通过sendBroadcast(Intent)方法发送出去

广播的类型

(1) 普通广播

即开发者自身定义intent的广播( 最常用);

(2) 系统广播

Android中内置了多个系统广播: 只要涉及到手机的基本操作( 如开机、 网络状态变化、 拍照等等) , 都会发出相应的广播;每个广播都有特定的Intent - Filter( 包括具体的action)。

(3) 有序广播

定义:发送出去的广播被广播接收者按照先后顺序接收;广播接受者接收广播的顺序规则( 同时面向静态和动态注册的广播接受者)

  1. 按照Priority属性值从大-小排序;
  2. Priority属性相同者, 动态注册的广播优先;
    特点:
  3. 接收广播按顺序接收
  4. 先接收的广播接收者可以对广播进行截断, 即后接收的广播接收者不再接收到此广播;
  5. 先接收的广播接收者可以对广播进行修改, 那么后接收的广播接收者将接收到被修改后的广播;
    接口:sendOrderedBroadcast(intent);

(4) App应用内广播 Local Broadcast

为什么需要应用内广播:
Android中的广播可以跨App直接通信( exported对于有intent-filter情况下默认值为true),就有可能出现应用间广播的冲突,冲突表现在:

  1. 效率性问题:其他App针对性发出与当前App中注册的广播接收器的intent-filter相匹配的广播, 由此导致当前App不断接收广播并处理;
  2. 安全性问题:其他App注册与当前App发送的广播一致的intent-filter的广播接收器用于接收广播, 获取广播具体信息;

解决方案:使用App应用内广播

  1. App应用内广播可理解为一种局部广播, 广播的发送者和接收者都同属于一个App;
  2. 相比于全局广播( 普通广播) , App应用内广播优势体现在:安全性高 & 效率高;

实现方式:

  1. 将全局广播设置成局部广播
    (1)注册广播接收器时将exported属性设置为false, 使得非本App内部发出的广播不被接收;
    (2)在广播发送和接收时, 增设相应权限permission, 用于权限验证;
    (3)发送广播时指定该广播接收器所在的包名, 此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。通过 intent.setPackage(packageName) 指定包名。
  2. 使用封装好的LocalBroadcastManager类
//注册应用内广播接收器
//步骤1: 实例化BroadcastReceiver子类 & IntentFilter
BroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();//步骤2: 实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);//步骤3: 设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);//步骤4: 调用LocalBroadcastManager单一实例的registerReceiver( ) 方法进行动态注册
localBroadcastManager.registerReceiver(mBroadcastReceiver, inten
tFilter);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);//步骤5:发送应用内广播
Intent intent = new Intent();
intent.setAction(android.net.conn.CONNECTIVITY_CHANGE);
localBroadcastManager.sendBroadcast(intent);

粘性广播

由于在Android5.0 & API 21中已经失效, 所以不建议使用, 在这里也不作过多的总结。

面试问题

广播的分类和使用场景?
广播的两种注册方式的区别?
广播发送和接收的原理?
本地广播和全局广播的区别?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法 | 力扣篇】力扣每日一题2965, 2928

1. 力扣2965 : 找出缺失和重复的数字 (1). 题 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失…

基于springboot+vue的家乡特色推荐系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

【数据结构与算法】后续遍历的非递归实现

/** /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param {TreeNode} root* re…

【Linux】Linux工具——gcc/g++

1.使用vim更改信用名单——sudo 我们这里来补充sudo的相关知识——添加信任白名单用户 使用sudo就必须将使用sudo的那个账号添加到信用名单里,而且啊,只有超级管理员才可以添加 信用名单在/etc/sudoers里 我们发现它的权限只是可读啊,所以…

分享:重庆耶非凡科技有限公司人力资源项目靠不靠谱?

在当今快速变化的商业环境中,人力资源项目作为企业发展的重要支撑,其专业性和可靠性成为企业选择合作伙伴时的重要考量因素。重庆耶非凡科技有限公司作为一家在行业内颇具影响力的科技企业,其人力资源项目——人力RPO(招聘流程外包)项目&…

dm8 什么时候视图中统计的内存会超过OS

v$bufferpool和v$mem_pool视图记录着DMSERVER各组件的内存占用量。理论上跟OS看到的保持一致。但实际大多数场景下,OS中看到的数据远大于视图中的统计。这里面可能有内存泄漏的原因。不过也有的时候视图中的统计数据超过OS。下面就是这种情况: 上图中红线…

Java_Mybatis

Mybatis是一款优秀的持久层框架,用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据: 代码演示: UserMapper: Mapper //被调用时会通过动态代理自动创建实体类,并放入IOC容器中…

用cloudflared 把家里电脑网站可以让任何人试用

一针见血说技术,通俗易懂去实现自己的想法 一、背景 搭建一个网站,或者有个自己开发的算法,需要供应少量的人免费服务,也可以用于向合伙人演示。需要一个云服务,要么购买。还得啰嗦学习一些网站的开通知识&#xff0…

单号日入50+,全自动挂机赚钱

大家好!今天我为大家精心挑选了一个极具潜力的副业项目——“游戏工作室自由之刃2:单号日入50,全自动挂机赚钱”。 传奇游戏,无疑是许多人心中那段青春时光的珍贵回忆。 即便是其手游版本,也依旧保持着极高的热度和人…

C++位运算

按位与: 按位与(AND)是一种位操作,用于将两个二进制数字的相应位进行逻辑与操作。其规则如下: 如果两个对应位的值都为1,则结果为1。否则,结果为0。 在C中,按位与操作符是 &。…

【教程】20个高级 Python 函数,让你编程更高效

在Python的编程世界中,函数是我们编写代码的重要工具之一。除了常见的内置函数外,Python还提供了许多强大而有趣的高级函数,它们可以帮助我们简化代码、提升效率,甚至在某些情况下让编程变得更加有趣。让我们一起来探索这些高级函数的奇妙之处吧! 1.enumerate() – 枚举函…

Chrome DevTools

Console 面板 此章节请打开 justwe7.github.io/devtools/console/console.html 一起食用 一方面用来记录页面在执行过程中的信息(一般通过各种 console 语句来实现),另一方面用来当做 shell 窗口来执行脚本以及与页面文档、DevTools 等进行交…

PDF 转 word (优化版)

PDF 转 word (优化版) 原文链接:url,针对原文做了一些优化,适配性更好 首先在pdf所在文件夹中创建pdf2word.py import os from pdf2docx import Converterdef pdf_docx():# 获取当前路径file_path os.getcwd()# 获取…

【C++进阶】深入STL之string:模拟实现走进C++字符串的世界

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C模板入门 🌹🌹期待您的关注 🌹🌹 ❀STL之string 📒1. string…

VRRP

文章目录 VRRP基本原理技术背景VRRP作用VRRP概述VRRP名词解释VRRP路由器VRRP组虚拟路由器虚拟IP地址、MAC地址Master、Backup路由器 VRRP状态机Master/ Backup 路由器Master路由器:Backup路由器: VRRP的工作过程 VRRP基础配置![image.png](https://img-blog.csdnimg.cn/img_con…

05C零碎语法

C零碎语法 目录 文章目录 C零碎语法1.函数指针2.回调函数3.数据拷贝3.1静态内存分配![请添加图片描述](https://img-blog.csdnimg.cn/direct/54d44e32bb7944f0866d4ca1e2667ce8.png)### 4.1动态内存分配 字符串6.sizeof()和strlen()的区别7.strcpy()/strncpy()函数7.1**strcp…

中继器、集线器、网桥、交换机、路由器和网关

目录 前言一、中继器、集线器1.1 中继器1.2 集线器 二、网桥、交换机2.1 网桥2.2 交换机 三、路由器、网关3.1 路由器3.2 网关 总结 前言 理解这些设备的关键是他们运行在不同的层次上。之所以存在不同层的问题,是因为不同的设备使用不同的信息来决定如何交换。在典…

【Hive SQL 每日一题】统计指定范围内的有效下单用户

文章目录 测试数据需求说明需求实现 前言:本题制作参考牛客网进阶题目 —— SQL128 未完成试卷数大于1的有效用户 测试数据 -- 创建用户表 DROP TABLE IF EXISTS users; CREATE TABLE users (user_id INT,name STRING,age INT,gender STRING,register_date STRING…

windows环境下重建oracle监听

由于某种原因导致数据库监听启动失败,需要重新创建监听。 过程如下: 第一步:修改 listenr.ora 文件 ,增加新的监听配置 LISTENER4 (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST DESKTOP-BE6GDNT)(PORT 152…

2024春季期中测验-入门组 补题报告

文章目录 一、概况二、正解A.problem1 题目描述2 大体思路3 AC代码B.test1 题目描述2 大体思路3 AC代码C.horse1 题目描述2 大体思路3 AC代码D.expert1 题目描述2 大体思路3 AC代码三、总结一、概况 比赛名称:2024春季期中测验-入门组 日期:2024-5-18 二、正解 A.proble…