【android开发-15】android中广播broadcast用法详解

1,broadcast类型

在Android中,Broadcast是一种用于在应用程序组件之间传递消息的机制。它允许一个组件(发送者)将消息发送给其他组件(接收者),即使它们之间不存在直接的联系。

Android中的Broadcast类型主要有以下几种:

1,普通广播(Ordinary Broadcast):这是默认类型的广播。当一个应用程序组件发送广播时,所有注册的广播接收器都会收到该广播。这种广播不会对接收者的数量进行限制。
在这里插入图片描述

2,有序广播(Ordered Broadcast):这是一种特殊的广播类型,可以按照接收者的优先级顺序逐个传递广播。发送者可以设置广播的优先级,并指定一组广播接收器按照优先级顺序接收广播。当一个接收者处理完广播后,广播会继续传递给下一个接收者。
在这里插入图片描述

3,系统广播(System Broadcast):系统广播是由操作系统或系统应用程序发送的广播。这些广播通常用于通知系统级别的操作,例如电量不足、内存不足等。应用程序可以注册系统广播的接收器来监听这些事件,并根据需要执行相应的操作。

4,粘性广播(Sticky Broadcast):这是一种特殊的系统广播类型,用于在一段时间内保持广播的传递。当一个粘性广播发送时,如果当前没有注册的接收器,则会在一段时间内保持传递,直到有接收器注册并接收该广播。这种广播通常用于需要持续通知的情境,例如网络连接变化等。

这些不同类型的广播可以根据需要选择使用,以满足不同的通信需求。

2,动态注册broadcast

在Android中,动态注册广播(Broadcast)需要遵循以下步骤:
1,创建BroadcastReceiver类:首先,你需要创建一个BroadcastReceiver类,该类将用于接收广播并处理接收到的广播数据。你可以在该类中重写onReceive()方法,该方法在接收到广播时被调用。

public class MyBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  // 处理接收到广播的逻辑  // 可以在这里根据intent的内容进行相应的处理  }  
}

2,实例化BroadcastReceiver:在你的应用程序中,你需要创建一个BroadcastReceiver的实例,以便能够接收广播。

MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

3,创建IntentFilter:创建一个IntentFilter对象,该对象用于指定你想要接收的广播的Action。例如,如果你想要接收网络连接变化(CONNECTIVITY_CHANGE)的广播,你可以使用以下代码:

IntentFilter filter = new IntentFilter();  
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例

4,注册BroadcastReceiver:使用registerReceiver()方法来注册BroadcastReceiver。你需要传递一个BroadcastReceiver对象和一个IntentFilter对象作为参数。注册后,你的BroadcastReceiver将会接收到指定Action的广播。

registerReceiver(myBroadcastReceiver, filter);

5,注销BroadcastReceiver:当你的应用程序不再需要接收广播时,你需要使用unregisterReceiver()方法注销BroadcastReceiver。这是为了避免内存泄漏。例如,你可以在Activity的onDestroy()方法中注销BroadcastReceiver:

unregisterReceiver(myBroadcastReceiver);

通过以上步骤,你可以在Android应用程序中动态注册并接收广播。请注意,动态注册的BroadcastReceiver只会在应用程序运行期间有效,当应用程序退出或用户切换到其他应用程序时,该Receiver会被注销。如果需要持续接收广播,可以考虑使用静态注册方式。

6,完整的动态注册参考代码:
在Android中,你可以使用registerReceiver()方法来动态注册一个BroadcastReceiver。以下是一个示例:

首先,定义一个BroadcastReceiver类:

public class MyBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  // 处理接收到广播的逻辑  // 可以在这里根据intent的内容进行相应的处理  }  
}

然后在你的Activity或Service中动态注册广播:

public class MyActivity extends AppCompatActivity {  private MyBroadcastReceiver myBroadcastReceiver;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 实例化BroadcastReceiver  myBroadcastReceiver = new MyBroadcastReceiver();  // 注册广播  IntentFilter filter = new IntentFilter();  filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例  registerReceiver(myBroadcastReceiver, filter);  }  @Override  protected void onDestroy() {  super.onDestroy();  // 在Activity销毁时,需要解注册广播,避免内存泄漏  unregisterReceiver(myBroadcastReceiver);  }  
}

以上代码会在Activity的onCreate方法中注册了一个名为"android.net.conn.CONNECTIVITY_CHANGE"的广播,当网络连接发生变化时,系统会发出这个广播,我们的MyBroadcastReceiver会接收到这个广播并在onReceive()方法中进行处理。同时,在Activity的onDestroy()方法中,我们通过unregisterReceiver()解注册了广播接收器,避免内存泄漏。

3,静态注册broadcast
在Android中,静态注册广播(BroadcastReceiver)需要将接收器(BroadcastReceiver)在应用程序的 AndroidManifest.xml 文件中进行声明,无需在运行时注册。以下是一个静态注册广播的示例代码:

1,在 AndroidManifest.xml 文件中添加 标签,指定要接收的广播的 Action 和与之关联的 BroadcastReceiver 类。例如,以下代码将注册一个 BroadcastReceiver,以接收网络连接变化(CONNECTIVITY_CHANGE)的广播:

<manifest ... >  <application ... >  <receiver android:name=".MyBroadcastReceiver" >  <intent-filter>  <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  </intent-filter>  </receiver>  ...  </application>  
</manifest>
```,2,在你的应用程序代码中定义 MyBroadcastReceiver 类,并实现 onReceive() 方法来处理接收到的广播数据。例如:```cpp
public class MyBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  // 处理接收到广播的逻辑  // 可以在这里根据 intent 的内容进行相应的处理  }  
}

当网络连接发生变化时,系统会发出 “android.net.conn.CONNECTIVITY_CHANGE” 广播,你的应用程序中的 MyBroadcastReceiver 类将会接收到该广播并在 onReceive() 方法中进行处理。

注意:在程序未运行的情况下就可以接收到广播。

4,发送自定义广播
在Android中,你可以通过发送自定义的广播来传递自定义的数据。以下是一个示例,演示了如何发送和接收一个自定义广播:

1,创建一个自定义的广播Intent:

public class CustomBroadcastIntent {  public static final String CUSTOM_ACTION = "com.example.app.CUSTOM_ACTION";  
}

2,在发送广播的代码中,创建一个新的Intent对象,设置其Action为自定义Action,并添加需要传递的数据。然后使用sendBroadcast()方法发送广播。

Intent intent = new Intent();  
intent.setAction(CustomBroadcastIntent.CUSTOM_ACTION);  
intent.putExtra("custom_data", "This is custom data");  
sendBroadcast(intent);

sendBroadcast是Context的方法。

3,创建一个BroadcastReceiver类,用于接收自定义广播并处理接收到的数据。在该类中,你需要重写onReceive()方法,并在该方法中处理接收到的广播数据。

public class CustomBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  if (intent != null && intent.getAction().equals(CustomBroadcastIntent.CUSTOM_ACTION)) {  String customData = intent.getStringExtra("custom_data");  // 处理接收到的自定义数据  }  }  
}

4,在AndroidManifest.xml文件中注册BroadcastReceiver,以便应用程序能够接收到自定义广播。

<manifest ... >  <application ... >  <receiver android:name=".CustomBroadcastReceiver" >  <intent-filter>  <action android:name="com.example.app.CUSTOM_ACTION" />  </intent-filter>  </receiver>  ...  </application>  
</manifest>

现在,当发送广播的代码被执行时,自定义广播将被发送到注册了相应Action的BroadcastReceiver。在BroadcastReceiver的onReceive()方法中,你可以获取到自定义的数据并进行处理。

5,发送有序广播
在Android中,你可以使用sendOrderedBroadcast()方法来发送有序广播。有序广播的接收器会按照优先级顺序进行回调。如果某个接收器返回true,则传递会停止,不会传递给其他接收器。下面是一个发送有序广播的参考代码例子:

// 创建一个广播Intent  
Intent intent = new Intent(this, MyBroadcastReceiver.class);  
// 添加一个附加数据  
intent.putExtra("extra_data", "This is extra data");  
// 发送有序广播  
sendOrderedBroadcast(intent, null);

在这个例子中,MyBroadcastReceiver是你自己定义的BroadcastReceiver类。你可以在该类中重写onReceive()方法来处理接收到的广播数据。在这个例子中,我们向广播Intent添加了一个附加数据,可以在接收到广播时从Intent中获取到这个数据。

你可以在onReceive()方法中根据需要处理接收到的广播数据。如果你需要让广播继续传递给其他接收器,可以返回false,否则返回true来停止广播的传递。

public class MyBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  // 处理接收到的广播数据  String extraData = intent.getStringExtra("extra_data");  // 继续传递广播给其他接收器  boolean result = false; // 可以根据需要修改这个值  abortBroadcast(); // 停止广播的传递  }  
}

在这个例子中,我们在onReceive()方法中获取了附加数据,并返回了false来继续传递广播给其他接收器。如果你不想让广播继续传递,可以将result变量设置为true并调用abortBroadcast()方法来停止广播的传递。

如何设置有序广播的优先级?
在Android中,你可以通过在BroadcastReceiver的AndroidManifest.xml文件中设置android:priority属性来设置有序广播的优先级。优先级值越高,广播接收器的优先级就越高。当广播被发送时,系统会按照优先级顺序回调广播接收器。

以下是一个示例,展示了如何在AndroidManifest.xml中设置BroadcastReceiver的优先级:

<receiver android:name=".MyBroadcastReceiver" android:priority="100">  <intent-filter>  <action android:name="com.example.app.MY_ACTION" />  </intent-filter>  
</receiver>

在这个示例中,MyBroadcastReceiver的优先级被设置为100。如果其他BroadcastReceiver也有监听相同的Action,那么它们的优先级会低于MyBroadcastReceiver。你可以根据需要设置不同的优先级值。

需要注意的是,虽然可以通过设置优先级来控制广播的传递顺序,但建议谨慎使用,以避免滥用导致系统性能问题。在大多数情况下,最好使用普通广播而不是有序广播。

6,使用本地广播

在 Android 中,你可以使用本地广播(Local Broadcasts)来发送和接收广播消息。本地广播是一种仅限于当前应用程序的广播机制,它不会像全局广播一样广播到整个系统。下面是一个使用本地广播的参考代码例子:

LocalBroadcastManager 是 Android 中用于处理本地广播的类。它可以帮助你在应用程序内部更安全地发送和接收广播。下面是一个使用 LocalBroadcastManager 的参考例子:

1,创建一个广播类,例如 MyBroadcast:

public class MyBroadcast {  public static final String ACTION_NAME = "com.example.MY_ACTION";  public static final String EXTRA_MESSAGE = "message";  
}

2,创建一个广播接收器类,例如 MyBroadcastReceiver:

import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import androidx.swiperefresh.widget.SwipeRefreshLayout;  
import android.util.Log;  public class MyBroadcastReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  String message = intent.getStringExtra(MyBroadcast.ExtraMessage);  Log.d("MyBroadcastReceiver", "Received message: " + message);  // 在这里处理接收到广播的逻辑  }  
}

3,在你的 Activity 或 Fragment 中使用 LocalBroadcastManager 发送广播:

import androidx.localbroadcastmanager.content.LocalBroadcastManager;  
import androidx.swiperefresh.widget.SwipeRefreshLayout;  
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.os.Bundle;  
import androidx.appcompat.app.AppCompatActivity;  
import android.view.View;  
import android.widget.Button;  public class MainActivity extends AppCompatActivity {  private static final String TAG = "MainActivity";  private LocalBroadcastManager localBroadcastManager;  private MyBroadcastReceiver myBroadcastReceiver;  private Button sendBroadcastButton;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  localBroadcastManager = LocalBroadcastManager.getInstance(this);  myBroadcastReceiver = new MyBroadcastReceiver();  sendBroadcastButton.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  localBroadcastManager.sendBroadcast();  }  });  // 注册广播  IntentFilter filter = new IntentFilter();  filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例  localBroadcastManager.registerReceiver(myBroadcastReceiver, filter); }  
}

注意:本地广播无法通过静态方式注册来接收广播。

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

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

相关文章

挑战音频爬虫的技术迷宫:Watir和Ruby的奇妙合作

概述 音频爬虫是一种可以从网站上抓取音频文件的程序。音频爬虫的应用场景很多&#xff0c;比如语音识别、音乐推荐、声纹分析等。然而&#xff0c;音频爬虫也面临着很多技术挑战&#xff0c;比如音频文件的格式、编码、加密、隐藏、动态加载等。如何突破这些技术障碍&#xf…

整数和浮点数在内存中的存储​(大小端详解)

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1为什么有大小端?​ 2.2请简述大端字节序和小端字节序的概念&#xff0c;设计一个小程序来判断当前机器的字节序。&#xff08;10分&#xff09;-百度笔试题 方法一&#xff08;char*强制类型转换&#xff09…

迅为RK3588开发板定制Ubuntu和Debian系统-系统定制(无法联网)

在上一个小节中讲解了 ubuntu 和 debian 文件系统的定制&#xff0c;但那是在可以运行脚本正常构 建系统的前提下&#xff0c;而本小节则是针对部分特殊用户无法联网的情况。 在 source 目录下存放了已经构建完成的压缩包&#xff0c;如下图所示 然后使用以下命令将该压缩包解…

Hive SQL的各种join总结

说明 Hive join语法有6中连接 inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左半开连接&#xff09;、cr…

prime靶机打靶记录

靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口&#xff0c;因为是靶机&#xff0c;所以速率直接调了10000 扫出来两个端口22和80&#xff0c;进行详细的扫描 没…

matlab cell转三维矩阵

问题描述 我有一个cell类型的wlf变量&#xff0c;16行4列&#xff0c;每个单元格都是[1000,1]的矩阵&#xff0c;如下图所示 业务含义&#xff1a;代表16个医院的4个业务指标的1000次模拟值&#xff08;蒙特卡洛模拟&#xff09; 我想要处理成[16,4,1000]的三维矩阵&#xff0…

分享116个图片JS特效,总有一款适合您

分享116个图片JS特效&#xff0c;总有一款适合您 116个图片JS特效下载链接&#xff1a;https://pan.baidu.com/s/1WvUvmG1adR2EJG97MiGj3A?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

基于vue+node.js智慧校园学生办证系统

基于vuenode.js智慧校园学生办证系统 摘要&#xff1a;随着计算机技术和网络技术的飞快发展&#xff0c;它加速了国内信息化建设的进程&#xff0c;信息技术对管理改革产生了深远的影响。为了适应新时代的发展趋势&#xff0c;各行各业都高度重视信息化建设。在教育领域&#…

header二

第二题就是在referer添加SQL语句进行注入和上一题步骤一样 第三题 再用上面那个方法就行不通了&#xff0c;多加了一层过滤 1and updatexml(1,"1",1),1) -- 1 1and updatexml(1,concat("1",(select database())),1),1) -- 1 1and updatexml(1,concat("…

律所信息化建设成为趋势,Alpha系统助力律所数字化升级

近些年来&#xff0c;越来越多的律所借助数字化技术进行信息化建设&#xff0c;围绕“智慧律所”建设做了大量的努力。为尽快完成这一目标&#xff0c;经过深入研判&#xff0c;多数律所决定引进“Alpha法律智能操作系统”。该系统以其强大功能为律所智慧化建设注入催化剂。 据…

Python小案例:打印三角形

打印不同形状以及方向的三角形 分析 需要利用循环打印规则 代码部分 userint(input("请输入打印行数&#xff1a;"))# 打印正向直角三角形 def Triangls_01(user_input):for i in range(1,user_input):print("*"*i)# 打印倒向直角三角形 def Triangls_0…

训练lora小模型

训练lora小模型 一&#xff0c;安装部署本地训练环境1&#xff0c;下载源码2&#xff0c;下载模型 二&#xff0c;准备数据1&#xff0c;准备图片2&#xff0c;标注图片 三&#xff0c;修改配置1&#xff0c;修改文件名2&#xff0c;修改配置文件 &#xff0c;install.ps1 四&a…

如何压缩GIF图片?三个方法轻松解决!

GIF图片格式大&#xff0c;社交平台对其有限制&#xff0c;需用图片处理工具压缩。嗨格式压缩大师、PS、EZGIF三种工具可实现压缩。 GIF图片由于其图片格式&#xff0c;本身就会很大&#xff0c;但是微信QQ还有一些其他的社交平台对上传的表情包是有限制的&#xff0c;这个时候…

浅析预付费用户电能管理系统的设计与应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;该设计解决了IC卡预付费电能表存在的问题&#xff0c;同时继承了先购电后用电的管理模式.电力部门的管理微机通过RS485网络对电能表进行管理&#xff0c;以防止用户窃电&#xff1b;选用射频卡作为用户卡以…

利用 EC2 和 S3 免费搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。 &#x1f4bb;创建实例 控制台搜索EC2 点击启动EC2 选择AMI 选择可免费试用的 g代表采用了Graviton2芯片。 配置存储 配…

物联网水表和4G水表的区别有哪些?

随着科技的发展&#xff0c;水表也不再是传统的机械表&#xff0c;而是经过数字化和智能化改造的物联网水表和4G水表。这两种水表具有很多的不同点。那么&#xff0c;物联网水表和4G水表的区别有哪些&#xff1f; 首先&#xff0c;物联网水表和4G水表的通信方式不同。物联网水表…

Zabbix监控接收SNMPTrap消息与SNMPTT结合

一.SNMP 协议 1.协议介绍 snmp 协议是日常使用的较多的一种协议&#xff0c;绝大多数网络设备/存储等都支持 snmp 协议&#xff0c;通过此协议可以实现设备状态的监控及管理。 2.主要组成 SNMP 协议包括以下三个部分: SNMP Agent&#xff1a;负责处理 snmp 请求&#xff0c…

LeetCode-二叉树OJ题

1.单值二叉树 965. 单值二叉树https://leetcode.cn/problems/univalued-binary-tree/ 先判断这棵树是否为空&#xff0c;如果是空树则是true。再判断左子树是否为空&#xff0c;并且左子树的值val和当前节点的val不相同&#xff0c;如果这左子树不为空且val不等于root的val则…

二百一十二、Flume——Flume实时采集Linux中的目录文件写入到HDFS中(亲测、附截图)

一、目的 在实现Flume实时采集Linux中的Hive日志写入到HDFS后&#xff0c;再做一个测试&#xff0c;用Flume实时采集Linux中的目录文件&#xff0c;即使用 Flume 监听Linux整个目录的文件&#xff0c;并上传至 HDFS中 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、…

一张网页截图,AI帮你写前端代码,前端窃喜,终于不用干体力活了

简介 众所周知&#xff0c;作为一个前端开发来说&#xff0c;尤其是比较偏营销和页面频繁改版的项目&#xff0c;大部分的时间都在”套模板“&#xff0c;根本没有精力学习前端技术&#xff0c;那么这个项目可谓是让前端的小伙伴们看到了一丝丝的曙光。将屏幕截图转换为代码&a…