Broadcast 广播使用详解

b9acd412e9889785682e1984660f7fd8.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Broadcast概述
二、Broadcast的注册
三、Broadcast的注册类型
四、静态注册开机广播的实现
五、动态监听亮灭屏幕广播实现
六、广播的发送方法
七、参考文献

一、Broadcast概述

在了解广播之前,我们先了解Broadcast继承关系 ,
Broadcast的继承关系如下:

java.lang.Object↳    android.content.BroadcastReceiver

Broadcast是 Android 四大组件之一,是一种广泛运用在应用程序之间异步传输信息的机制。Broadcast 本质上是一个Intent 对象,差别在于Broadcast可以被多个 BroadcastReceiver处理。BroadcastReceiver 是一个全局监听器,通过它的 onReceive() 可以过滤用户想要的广播,进而进行其它操作。

BroadcastReceiver 默认是在主线程中执行,如果onReceiver()方法处理事件超过10s,则应用将会发生ANR(Application Not Responding),此时,如果建立工作线程并不能解决此问题,因此建议:如处理耗时操作,请用 Service代替。

BroadcastReceiver的主要声明周期方法onReceiver(),此方法执行完之后,BroadcastReceiver实例将被销毁。

二、Broadcast的注册

Broadcast 属于Android四大组件之一,必须在Androidmainfest.xml中注册.

Broadcast 注册方法如下:

<receiverandroid:name="ReceiverMethod"android:enabled="true"android:exported="true"><intent-filter><action android:name="String....." /></intent-filter></receiver>

注意:
如不注册,将导致无法接收处理广播消息

三、Broadcast的注册类型

广播的注册分两种(静态注册、动态注册),一种在Androidmainfest.xml中静态注册,另一种是在Java代码中动态注册。

1.静态注册

一些系统发送的广播需要在Androidmainfest.xml中静态注册,例如 开机广播,apk状态改变广播,电量状态改变广播等。这些静态注册的广播,通常在Androidmainfest.xml中拦截特定的字符串。

静态注册广播的方法如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.programandroid"android:versionCode="1"android:versionName="1.0" >... ...<receiverandroid:name="com.programandroid.BroadcastReceiver.NotificationReceived"android:enabled="true"android:exported="true" ><intent-filter><action android:name="Notification_cancel" /><action android:name="Notification_music_pre" /><action android:name="Notification_music_play" /><action android:name="Notification_music_next" /></intent-filter></receiver>... ...

2.动态注册广播

在Java中动态注册广播,通常格式如下:

//动态注册广播registerReceiver(BroadcastReceiver, IntentFilter);

四、静态注册开机广播的实现

1. 静态开机广播实现

p ublic class BootReceiverMethod extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//   接收开机广播处理事情,比如启动服务Intent mStartIntent = new Intent(context, StartServiceMethods.class);context.startService(mStartIntent);}
}

2.静态注册开机广播

<!-- 必须声明接收开机广播完成的权限--><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><receiverandroid:name=".component.BroadcastReceiver.BootReceiverMethod"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter></receiver>

五、动态监听亮灭屏幕广播实现

1.动态注册亮灭屏实现

动态注册广播方法是registerReceiver()
注意:
在广播中动态注册广播请注意一定要使用context.getApplicationContext(),防止context 为空 ,引起空指针异常。

动态注册亮灭屏实现实现如下:

public class ScreenOnOffReceiver {public static void ReceiverScreenOnOff(Context context) {IntentFilter screenOffFilter = new IntentFilter();screenOffFilter.addAction(Intent.ACTION_SCREEN_OFF);screenOffFilter.addAction(Intent.ACTION_SCREEN_ON);BroadcastReceiver mScreenOnOffReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString action = intent.getAction();if (action.equals(Intent.ACTION_SCREEN_OFF)) {Toast.makeText(context, "接收屏幕熄灭广播", Toast.LENGTH_SHORT).show();}if (action.equals(Intent.ACTION_SCREEN_ON)) {Toast.makeText(context, "接收屏幕点亮广播", Toast.LENGTH_SHORT).show();}}};/*** context.getApplicationContext()* 在广播中注册广播时候需要注意,防止context 为空 ,引起空指针异常* **/
// 2.动态注册广播的方法context.registerReceiver(mScreenOnOffReceiver, screenOffFilter);}
}

六、广播的发送方法

广播的方法有以下三种:
1.无序sendBroadcast(intent)
2.有序sendOrderedBroadcast()
3.持续sendStickyBroadcast())

1.发送无序广播的方法

发送无序广播在Android 中很常见,是一种一对多的关系,主要通过 sendBroadcast(intent);发送广播。

  • 1.发送自定义广播案例
    广播说白了就是一个带Action等字符串标记的Intent。发送自定义广播举例如下:

Intent customIntent=new Intent();customIntent.setAction("SendCustomBroadcast");sendBroadcast(customIntent);
  • 2.接收自定义广播的方法

当用户对某些广播感兴趣的话,此时可以获取此广播,然后在onReceive方法中处理接收广播的一下操作。

public class CustomBroadcast extends BroadcastReceiver {public CustomBroadcast() {}@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("SendCustomBroadcast")){Toast.makeText(context,"自定义广播接收成功:Action:SendCustomBroadcast",Toast.LENGTH_SHORT).show();}}
}

注意
自定义广播是在Androidmanfest.xml中静态注册的。

2.发送有序广播

广播在Android是有优先级的,优先级高的广播可以终止或修改广播内容。发送有序广播的方法如下sendOrderedBroadcast(intent,"str_receiver_permission");

  • 1.发送自定义有序广播

Intent customOrderIntent=new Intent();customOrderIntent.setAction("SendCustomOrderBroadcast");customOrderIntent.putExtra("str_order_broadcast","老板说:公司每人发 10 个 月饼");sendOrderedBroadcast(customOrderIntent,"android.permission.ORDERBROADCAST");

广播属于四大组件,一定要在AndroidMainfest.xml中注册。

  1. 有序广播静态注册
    接收有序广播的静态注册方法如下:

<receiverandroid:name=".component.BroadcastReceiver.CustomHightBrodcast"android:enabled="true"android:exported="true"><intent-filter android:priority="1000"><action android:name="SendCustomOrderBroadcast" /></intent-filter></receiver><receiverandroid:name=".component.BroadcastReceiver.CustomMiddleBroadcast"android:enabled="true"android:exported="true"><intent-filter android:priority="500"><action android:name="SendCustomOrderBroadcast" /></intent-filter></receiver><receiverandroid:name=".component.BroadcastReceiver.CustomLowerBroadcast"android:enabled="true"android:exported="true"><intent-filter android:priority="100"><action android:name="SendCustomOrderBroadcast" /></intent-filter></receiver>
  1. 有序广播处理,高优先级广播可以优先处理

public class CustomHightBrodcast extends BroadcastReceiver {public CustomHightBrodcast() {}@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("SendCustomOrderBroadcast")) {Toast.makeText(context, intent.getStringExtra("str_order_broadcast"), Toast.LENGTH_SHORT).show();Bundle bundle=new Bundle();bundle.putString("str_order_broadcast","经理说:公司每人发 5 个 月饼");
//            修改广播传输数据setResultExtras(bundle);}}
}
  1. 中优先级的广播后序处理

public class CustomMiddleBroadcast extends BroadcastReceiver {public CustomMiddleBroadcast() {}@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("SendCustomOrderBroadcast")) {Toast.makeText(context, getResultExtras(true).getString("str_order_broadcast"), Toast.LENGTH_SHORT).show();Bundle bundle=new Bundle();bundle.putString("str_order_broadcast","主管说:公司每人发 2 个 月饼");setResultExtras(bundle);}}
}
  1. 低优先级广播最后处理

public class CustomLowerBroadcast extends BroadcastReceiver {public CustomLowerBroadcast() {}@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("SendCustomOrderBroadcast")) {String notice= getResultExtras(true).getString("str_order_broadcast");Toast.makeText(context,notice, Toast.LENGTH_SHORT).show();
//          终止广播继续传播下去abortBroadcast();}}
}

注意 :
有序广播需要声明并使用权限

  • 1.声明使用权限

<!-- 申请使用自定义 有序广播的权限 --><uses-permission >   android:name="android.permission.ORDERBROADCAST" />
  • 2.声明权限

<!-- 自定义 有序广播的权限 --><permission>
android:name="android.permission.ORDERBROADCAST"/>

在有序广播中高优先级的广播接收广播,可以修改数据,然后传给低优先级的广播。

3.发送持续广播(已经被弃用)

粘性广播会在Android系统中一直存在,不过随着 Android系统的不断更新,此方法逐渐被抛弃,使用方法如下:sendStickyBroadcast(intent);

【腾讯文档】Android 基础知识库
https://docs.qq.com/doc/DSWdKRWh1VnVHYWFP

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

83267c85e7a2190c3449f3c0ae7f1b4f.jpeg

点击阅读原文,为大佬点赞!

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

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

相关文章

基于单片机快递柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息&#xff0c;最多可存储几十个&#xff1b;按下存储按键液晶显示当前快递柜剩余数量&#xff1b;继电器打开&#xff0c;表示用来放物品&#xff1b;正次按下存储按键将取消存快递&#xff0c;继电器关闭快递柜可用…

基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C#winform电脑关机实例

本篇实例演示C#winform电脑关机 创建winform添加一个按钮 Cs文件代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.T…

OpenCV安装及案例

目录 常见国内源: 一、简介 二、opencv安装 2.1在虚拟环境中安装 Original error was: No module named ‘numpy.core._multiarray_umath‘ 2.2在conda中安装 三、基本API opencv入门案例: 常见国内源: 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:…

Go实现在线词典翻译(三种翻译接口,结合sync)

火山翻译 首先介绍用火山翻译英译汉。 package mainimport ("bufio""bytes""encoding/json""fmt""io""log""net/http""os""strings""unicode" )type DictRequestHS st…

【Ajax】笔记-Ajax案例准备与请求基本操作

案例准备HTML 按钮div <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX GET 请求</title&g…

线上后端接口响应过慢排查记录_MySQLthread cache命中率过低导致的接口响应慢

文章目录 问题现象初步排查调整临时解决措施问题二次定位原因分析为什么会出现异常 问题现象 9点多&#xff0c;运营同学反馈系统某模块业务响应很慢&#xff0c;登录系统查看&#xff0c;后端接口响应耗时很久&#xff0c;需要好几秒&#xff1b; 查看对应的服务器资源情况&a…

Django实现简单的音乐播放器 4

在原有音乐播放器功能基础上&#xff0c;增加上传音乐功能。 效果&#xff1a; 目录 配置上传路径 配置路由 视图处理歌曲 引入类库 保存歌曲文件 模板上传 设置菜单列表 设置菜单列表样式 脚本设置 上传效果 1.显示菜单列表 2.点击上传歌曲 3.上传完成 4.查看保…

SpringBoot前后端分离项目,打包、部署到服务器详细图文流程

文章目录 实施步骤一、修改配置文件地址1.修改MySQL配置2.修改Redis配置3.修改日志路径和字符集配置 二、将源码压缩并上传服务器1.上传前端文件2.上传后端文件&#xff08;同上&#xff09; 三、前端项目打包1.安装依赖2.项目打包 四、后端项目打包1.项目打包&#xff08;jar包…

一次零基础靶机渗透细节全程记录

一、打靶总流程 1.确定目标&#xff1a; 在本靶场中&#xff0c;确定目标就是使用nmap进行ip扫描&#xff0c;确定ip即为目标&#xff0c;只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描&#xff0c;但不局限于这个nmap。 2.信息收集&#xff1a; 比如平常挖…

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA 1.背景介绍2.数学模型3.文件结构4.算法流程图5.伪代码6.详细代码及注释6.1 AVOA.m6.2 boundaryCheck.m6.3 exploitation.m6.4 exploration.m6.5 initialization.m6.6 levyFlight.m6.7 main.m6.8 ObjectiveFunction.m6.9 random_se…

前端处理后端返回的文件流,进行文件下载

二进制流格式 Blob格式 前言&#xff1a; 需求&#xff1a;根据后端接口返回的文件流进行数据处理&#xff0c;并实现文件的下载&#xff0c;且下载文件为word文档. 代码实现&#xff1a; //下载文件 async function DownLoadFile(row) {let res await DownLoadFileAPI(row.…