当前位置: 首页 > news >正文

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类

  1. 广播的发送方式:标准广播、有序广播、粘性广播
  2. 广播的类型:系统广播、本地广播

1.1 标准广播

  • 完全异步,无序的广播
  • 发出后,所有的广播接收器几乎都会在同一时间收到消息。(异步)
  • 但是消息无法截断。(无序)
  • 消息可以通过sendBroadcast()方法发送
    在这里插入图片描述

1.2 有序广播

  • 同步的广播
  • 在广播发送出去之后,同一时刻只能有一个广播接收器收到消息,当这个广播接收器处理完毕后,其他广播接收器才能收到消息。
  • 过程
    1. 通过sendOrderedBroadcast(intent)发送,发送出去的同步的广播被Receiver按照优先级先后顺序接收,相同优先级的动态注册的广播优先。
    2. 每次只能有一个接收者收到,接收者收到后,可以通过setResultData来传递数据给下一个接收者,也可以通过abortBroadcast()来终止广播继续向下传递。
  • 设置优先级的方式(AndroidManifest.xml)
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filterandroid:priority="100"></intent-filter>
</receiver>

在这里插入图片描述

1.3 粘性广播

  • 类似于粘性事件
  • 粘性广播发送后就会一直存在系统的消息容器里面,等待对应的处理器去处理。
  • 如果暂时没有处理器处理这个消息,则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。

1.4 系统广播

  • 系统会在发生各种系统事件时自动发送广播。
    • 例如当系统进入和退出飞行模式时,系统广播就会发送给所有同意接收相关事件的应用。
    • 系统内置的广播,比如开启、锁屏、时间等等(一般都是有序广播)
      在这里插入图片描述

1.5 本地广播

  • 广播理论上是所有注册这个广播接收器的人都能收到,那么会存在恶意注册我们对应的广播接收器,来接收到我们的广播。可能造成隐私泄露。

  • 所以我们让广播只能在本应用内传播,外部无法接收。只在当前程序内生效的广播

  • 在Manifest.xml中将Receiver的exported属性改为false,即可以让该广播接收器只接收本地广播。

2. 广播接收器的注册

  • 创建一个类,继承BroadcastReceiver类,并重写onReceive方法。这样当有广播来时,onReceive就会收到消息被调用。
    在这里插入图片描述

2.1 静态注册(Manifest)

  • 在AndroidManifest文件中声明一下这个广播,并在<receiver>字段里面的<intent-filter>添加需要接收的广播action即可。

  • 从Android8.0开始,隐式广播就不允许通过系统注册(静态注册)的方式来接收了,这样是为了防止APP通过此方法唤醒、保活、导致大量APP处于活跃状态,进而系统卡顿。

  1. 隐式广播:隐式广播就是没有指明接收程序的广播
  2. 广播为什么能唤醒:系统软件包管理器会在应用安装时注册receiver。然后接收器会成为应用的一个独立入口,这意味着如果应用当前未运行,系统可以启动应用并发送广播。只要注册上下文有效,上下文注册的接受者就会接收广播。
  3. 系统广播:大多数系统广播都是隐式广播,不过少数的系统广播不是,所以可以监听。(开机启动,下面的案例)
  4. 解决方法
    1. 尽量使用动态注册代替静态注册
    2. 如果必须要使用静态注册的话,那么就得在创建Intent后调用setComponent设置Component(启动指定Receiver接收),然后其他注册广播的步骤和原来在Android6.0系统一下注册的方法一样。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.example.broadcasttest"><!--监听系统开机广播也需要声明权限,可以看到,我们使用<user-permission>标签里又加入了一条android.permission.RECEIVE_BOOT_COMPLETED权限。--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Broadcasttest">...<receiverandroid:name=".MainActivty$BootCompleteReceiver"android:enabled="true"android:exported="true"tools:ignore="Instantiatable"><!--由于Android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们在<intent-filter>标签里添加了相应的action。--><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver></application>
</manifest>

2.2 动态注册

  1. 首先创建一个IntentFilter实例,使用addAction方法添加对应的action
  2. 创建自定义的广播接收器对象Receiver。
  3. 通过registerReceiver(receiver , intentFilter)传入 接收器对象 和 intentFilter对象实现注册。
  • 动态注册中,广播一定要在onDestroy方法中调用unregisterReceiver方法取消注册,否则会发生内存泄露。
  • onReceive方法中不能执行耗时操作,因为广播接收器中不允许开启线程
    在这里插入图片描述
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
BroadcastReceiver br = new MyBroadcastReceiver();
this.registerReceiver(br, filter);//非静态内部类——接收器
public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "MyBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {StringBuilder sb = new StringBuilder();sb.append("Action: " + intent.getAction() + "\n");sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");String log = sb.toString();Log.d(TAG, log);Toast.makeText(context, log, Toast.LENGTH_LONG).show();}}
  • 只要注册上下文有效,上下文注册的BroadcastReceiver就会接收广播
  • 如果您在 Activity 上下文中注册,只要 Activity 没有被销毁,您就会收到广播。如果您在Application上下文中注册,只要Application在运行,您就会收到广播。

3. 发送广播

3.1 发送标准广播

  1. 创建一个Intent对象,构造方法中传入需要的action
  2. 调用setPackage指明发送给的应用
  3. 通过sendBroadcast发送这个Intent
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.allbroadcasttest.MY_BROADCAST"/></intent-filter>
</receiver>    
  • 为什么现在一定要设置发送的包名?
  • 自定义广播默认是隐式广播(不能在静态注册下发送)
  • 所以指定这条广播发给哪个程序,变成显示广播。
@Override
public void onClick(View v){Intent intent = new Intent("com.example.allbroadcasttest.MY_BROADCAST");intent.setComponent(new ComponentName(getPackageName() , "com.example.allbroadcasttest.MY_BROADCAST"));sendBroadcast(intent);
}    

在这里插入图片描述

3.2 发送有序广播

  • 也是构造一个对象,区别在于发送广播的方式变成了sendOrderBroadcast方法。
  1. 需要两个参数,一个是Intent,另一个是与权限相关的,一般是null。
  2. 然后需要在receiver的AndroidManifest文件中receiver字段下面给广播设置个优先级。
  3. 如果有Receiver要截断广播,就调用abortBoardcast()。

3.3 发送本地广播(已被弃用)

  • 跟动态注册广播接收器一样,只不过在onCreate中创建LocalBroadcastReceiver对象。
  • 然后注册和发送都是调用LocalBroadcastManager的registerReceiver和sendBroadcast。

4. 相关问题

4.1 不取消注册广播会导致内存泄露吗?

在这里插入图片描述

4.2 广播中能执行耗时操作吗?

在这里插入图片描述

4.3 本地广播为什么被废弃了?

在这里插入图片描述

4.4 到底什么是广播?

在这里插入图片描述

4.5 短信用的是什么广播?

  • 系统广播
  • 会发出一套android.provider.Telephony.SMS_RECEIVED的action

4.6 显示和隐式广播的补充?

  • 所以不要用静态注册最好
  • 用了必须加 intent.setComponent(new ComponentName(getPackageName() ,"com.example.allbroadcasttest.MY_BROADCAST"));
  • 指定包名和类名
    在这里插入图片描述

相关文章:

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类 广播的发送方式&#xff1a;标准广播、有序广播、粘性广播广播的类型&#xff1a;系统广播、本地广播 1.1 标准广播 完全异步&#xff0c;无序的广播发出后&#xff0c;所有的广播接收器几乎都会在同一时间收到消息。&#xff08;异步&#xff09;但是消息无法截…...

Ubuntu下mysql8开启远程连接

环境 mysql8ubuntu22.04 更改配置文件 vim /etc/mysql/mysql.conf.d/mysqld.conf找到 bind-address 127.0.0.1 mysqlx-bind-address 127.0.0.1 把这两行注释掉&#xff0c;保存退出即可 修改mysql配置 登录mysql创建一个远程连接账户,名字任意&#xff0c;密码任意,用户名…...

java对象和json类型转换

fastjson参考 参考&#xff1a;http://doc.yaojieyun.com/www.runoob.com/w3cnote/java-json-instro.html 参考&#xff1a; http://doc.yaojieyun.com/www.runoob.com/w3cnote/fastjson-intro.html 序列化&#xff1a;JSON.toJSONString(person)将Java 对象转换为 JSON 字符串…...

elasticsearch-head 插件

1、elastic 插件说明 **Head** 是第三方提供的一款很优秀的插件&#xff0c;集监控、查询、配置一体的web功能系统&#xff0c;可以在系统中进行创建、删除索引 、文档。以及查询、配置索引等功能&#xff0c;深受广大开发者的喜爱 **Kopf** 是另一个第三方提供的一款很优秀…...

Neo4j之FOREACH基础

在 Neo4j 中&#xff0c;FOREACH 语句用于在查询中对一组元素执行某些操作&#xff0c;通常是在创建或更新节点关系时。它常常与 CREATE 或 SET 等操作结合使用。 创建多个关系&#xff1a; MATCH (p:Person), (m:Movie) WHERE p.name Alice AND m.title The Matrix FOREAC…...

【SpringBoot】| 接口架构风格—RESTful

目录 一&#xff1a;接口架构风格—RESTful 1. 认识RESTful 2. RESTful 的注解 一&#xff1a;接口架构风格—RESTful 1. 认识RESTful &#xff08;1&#xff09;接口 ①接口&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&…...

CentOS系统环境搭建(十)——CentOS7定时任务

centos系统环境搭建专栏&#x1f517;点击跳转 使用CentOS系统环境搭建&#xff08;九&#xff09;——centos系统下使用docker部署项目的项目做定时任务。 CentOS7定时任务 查看现有的定时任务 crontab -l编辑定时任务 crontab -e示例 每天凌晨两点运行脚本 清理内存 0 2 *…...

如何在安卓设备上安装并使用 ONLYOFFICE 文档

您可以使用文档安卓版应用&#xff0c;在移动设备上访问存在您 ONLYOFFICE 帐号中的文件。阅读本文&#xff0c;了解如何操作。 什么是 ONLYOFFICE 文档安卓版 适用于 Android 系统的 ONLYOFFICE 文档是一款全面的办公工具&#xff0c;您可以使用它&#xff0c;查看、创建、编…...

【制作npm包1】申请npm账号、认识个人包和组织包

概述 在开发当中经常有一种现象&#xff0c;重复代码写了N多遍&#xff0c;再次写同样的逻辑就再次翻查以前的代码逻辑。效率低下且容易出错&#xff0c;封装一个npm包的价值也不仅仅是给别人用&#xff0c;封装一套属于自己或者本部门的npm包也是相当有必要。 也许经常看到一…...

linux学习(文件描述符)[11]

一切皆文件 用代码创建的文件&#xff0c;默认路径在可执行文件同级目录下&#xff08;本质是进程通过系统接口创建的&#xff09; 文件宏 在Linux下&#xff0c;有一些与文件操作相关的宏可以用于处理文件描述符和文件权限。以下是一些常用的文件宏&#xff1a; STDIN_FIL…...

影响力再度提升,Smartbi多次蝉联Gartner、IDC等权威认可

近期&#xff0c;思迈特软件捷报频传&#xff0c;Smartbi凭借技术创新实力和产品能力&#xff0c;成功入选Gartner中国增强数据分析代表厂商及自助分析代表厂商&#xff0c;同时&#xff0c;连续三年蝉联“IDC中国FinTech 50”榜单。 Part.1 再次被Gartner提名 Smartbi深度融…...

【动态map】牛客挑战赛67 B

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 考虑动态的map 可以先定义一个状态&#xff0c;然后用map统计前缀这个状态的出现次数 在这里&#xff0c;定义{a,b}为cnt1 - cnt0和cnt2 - cnt0 当cnt0 和 cnt1都和cnt2相同时&#xff0c;统计贡献…...

mysql(2)

1.ACID 关系型数据库都有ACID特性 原子性&#xff08;Atomicity&#xff09; &#xff1a; 事务是最小的执行单位&#xff0c;不允许分割。事务的原子性确保动作要么全部完成&#xff0c;要么完全不起作用&#xff1b;一致性&#xff08;Consistency&#xff09;&#xff1a;…...

介绍 Apache Spark 的基本概念和在大数据分析中的应用

Apache Spark是一种基于内存计算的大数据处理框架&#xff0c;它支持分布式计算&#xff0c;并且能够处理比传统处理框架更大量的数据。以下是Apache Spark的一些基本概念和在大数据分析中的应用&#xff1a; RDD (Resilient Distributed Dataset)&#xff1a;RDD是Spark的核心…...

Vue CLI创建Vue项目详细步骤

&#x1f680; 一、安装Node环境&#xff08;建议使用LTS版本&#xff09; 在开始之前&#xff0c;请确保您已经安装了Node.js环境。您可以从Node.js官方网站下载LTS版本&#xff0c;以确保稳定性和兼容性。 中文官网下载 确认已安装 Node.js。可以在终端中运行 node -v 命令…...

机器学习算法之-逻辑回归(2)

为什么需要逻辑回归 拟合效果太好 特征与标签之间的线性关系极强的数据&#xff0c;比如金融领域中的 信用卡欺诈&#xff0c;评分卡制作&#xff0c;电商中的营销预测等等相关的数据&#xff0c;都是逻辑回归的强项。虽然现在有了梯度提升树GDBT&#xff0c;比逻辑回归效果更…...

【业务功能篇65】maven加速 配置settings.xml文件 镜像

maven加速 添加阿里镜像仓 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additi…...

题目:售货员的难题(状压dp)

售货员的难题 题目描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a; 思路AC代码&#xff1a; 题目描述 某乡有n个村庄( 1 < n < 16 )&#xff0c;有一个售货员&#xff0c;他要到各个村庄去售货&am…...

Linux 的 MySQL 5.x - 关于 Windows 10 的 Navicat Premium 导入 Excel (.xlsx)文件,报错问题集锦

问题 [ERR] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:01’ for column ‘xxx_time’ 解决方法&#xff1a; Windows 则是 my.ini Linux 系统则是 /etc/my.cnf 修改my.ini配置文件&#xff0c;建议修改前新备份下&#xff0c; my.ini中查找sql-mode&#xff0…...

基于IP网络的存储协议——iSCSI

文章首发地址 iSCSI&#xff08;Internet Small Computer System Interface&#xff09;是一种基于IP网络的存储协议&#xff0c;它能够在TCP/IP网络上实现SCSI协议&#xff0c;使得不同的主机可以通过网络共享存储设备。iSCSI可以将存储设备映射到本地主机上&#xff0c;使得主…...

SP140 ESC遥测驱动库:曼彻斯特编码与单线UART嵌入式解析

1. OpenPPG_SP140_ESC 库深度解析&#xff1a;面向电动动力系统的嵌入式ESC遥测驱动开发指南1.1 项目定位与工程价值OpenPPG_SP140_ESC 是一个专为 SP140 电子调速器&#xff08;ESC&#xff09;设计的 Arduino 兼容库&#xff0c;其核心价值不在于通用电机控制&#xff0c;而在…...

nfc-list使用教程

nfc-list 是 Kali Linux 中基于 libnfc 库&#xff08;开源 NFC 开发框架&#xff09;的基础 NFC/RFID 设备检测工具&#xff0c;核心功能是扫描并列出当前连接的 NFC 读卡器设备&#xff0c;以及贴近读卡器的 NFC 卡片&#xff08;或标签&#xff09;的详细信息&#xff0c;包…...

Arduino轻量级协作式任务调度库Jobber详解

1. Jobber库概述&#xff1a;面向Arduino的轻量级协作式任务调度框架Jobber是一个专为资源受限嵌入式平台&#xff08;尤其是Arduino系列MCU&#xff09;设计的协作式任务调度库&#xff0c;其核心目标是提供一种“模拟多线程”的编程模型&#xff0c;使开发者能够以接近线程的…...

MATLAB分类学习器保姆级教程:从鸢尾花数据集到模型导出全流程

MATLAB分类学习器实战指南&#xff1a;从鸢尾花分类到工业级模型部署 当你第一次面对MATLAB中那个名为"Classification Learner"的图标时&#xff0c;可能不会想到这个看似简单的交互式工具能够如此高效地完成从数据探索到生产级模型部署的全流程。不同于传统编程式机…...

研发物料管理新思路:巧用SAP预留功能实现打样耗材精准管控

研发物料管理新思路&#xff1a;巧用SAP预留功能实现打样耗材精准管控 在制造业研发部门&#xff0c;物料管理一直是令人头疼的难题。不同于生产线的标准化流程&#xff0c;研发活动往往伴随着频繁的设计变更、小批量试制和突发性物料需求。传统的手工台账或Excel表格管理方式&…...

PCB拼板工艺全解析:从设计到生产的核心要点

1. PCB拼板的核心价值与必要性PCB拼板是电子工程中一项看似简单却极为关键的工艺环节。作为一名从业十年的硬件工程师&#xff0c;我处理过上千款PCB设计&#xff0c;深刻体会到合理拼板对生产效率和成本控制的影响。简单来说&#xff0c;拼板就是将多块相同或不同的PCB按照特定…...

【C/C++基础】C++输入流实战:cin、getline与缓冲区的那些事儿

1. C输入流基础&#xff1a;从键盘到缓冲区的旅程 每次在终端敲下字符时&#xff0c;你可能没意识到这些数据要先经历一场"缓冲区历险记"。想象缓冲区就像快递柜&#xff0c;键盘输入相当于快递员把包裹&#xff08;数据&#xff09;放进柜子&#xff0c;而cin等输入…...

别再手动画图了!用GOT10K Toolkit一键搞定主流跟踪器评估(附SiamFC实战)

告别低效评测&#xff1a;用GOT10K Toolkit实现目标跟踪算法自动化评估 在计算机视觉领域&#xff0c;目标跟踪算法的研究往往需要耗费大量时间在模型评测环节。传统的手动评估流程不仅繁琐低效&#xff0c;还容易引入人为误差。想象一下这样的场景&#xff1a;你刚用PyTorch实…...

告别tmpfs和ramfs:自己动手写一个极简内存文件系统,深入理解VFS与Page Cache

从零构建内存文件系统&#xff1a;深入VFS与Page Cache的工程实践 在Linux系统中&#xff0c;内存文件系统&#xff08;Memory File System&#xff09;因其卓越的I/O性能而广受开发者青睐。不同于传统磁盘文件系统需要经过块设备层和驱动栈的冗长路径&#xff0c;内存文件系统…...

从HC-SR04到智能报警:手把手教你用51单片机做个超声波倒车雷达原型

从HC-SR04到智能报警&#xff1a;手把手教你用51单片机做个超声波倒车雷达原型 在汽车电子和智能硬件领域&#xff0c;倒车雷达作为基础安全配置已经普及多年。但对于电子爱好者和嵌入式开发者来说&#xff0c;用最基础的51单片机搭配HC-SR04超声波模块实现一个具备三级报警功能…...