【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); 
    }  
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

耦合与内聚:软件设计中的黄金平衡

目录 1. 耦合&#xff08;Coupling&#xff09;的本质 1.1 强耦合与弱耦合 2. 内聚&#xff08;Cohesion&#xff09;的价值 2.1 任务内聚与数据内聚 3. 耦合与内聚的平衡 3.1 黄金平衡的追求 3.2 设计原则与模式的应用 4. 实际案例分析 5. 总结与展望 在软件设计的世界…

深入理解Java核心技术:Java工程师的实用干货笔记

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Java工程师的职业生涯中&#xff0c;深入理解…

项目中枚举的进阶用法(携带Java原理分析)

目录 1 枚举的普通用法1.1 无参1.2 单个参数1.3 两个参数 2 枚举的进阶用法&#xff08;核心&#xff09;2.1 优化2.1.1 需要改造的代码2.1.2 直接使用泛型2.1.3 使用反射---Class2.1.4 反射泛型 2.2 最终效果2.3 思考&#xff1a;类型擦除 遇到项目中这样一种写法&#xff0c;…

2023五岳杯量子计算挑战赛A题B题C题思路+模型+代码+论文

赛题思路&#xff1a;12月6日晚开赛后第一时间更新&#xff0c;获取见文末名片 “五岳杯”量子计算挑战赛&#xff0c;是国内专业的量子计算大赛&#xff0c;也是玻色量子首次联合移动云、南方科技大学共同发起的一场“企校联名”的国际竞赛&#xff0c;旨在深度融合“量子计算…

第二节JavaScript 语法、语句、注释、变量、数据类型等

一、JavaScript语法 1、JavaScript字面量 数字&#xff08;Number&#xff09;字面量&#xff1a;可以是整数或者是小数、或者是科学计数。 如&#xff1a;3.14 、1001 、123e5 字符串&#xff08;String&#xff09;字面量&#xff1a;可以使用单引号或双引号。 例如&…

2023年文章生成器推荐

2023年即将结束&#xff0c;今年可以说是大语言模型独领风骚的一年&#xff0c;对于内容创作来说&#xff0c;文章生成类的工具也发生了变化。今天给大伙介绍一些超赞的免费文章生成器&#xff0c;让你在内容创作的路上事半功倍。有了这些神奇的工具&#xff0c;你将能够轻松应…

从 MQTT、InfluxDB 将数据无缝接入 TDengine,接入功能与 Logstash 类似

利用 TDengine Enterprise 和 TDengine Cloud 的数据接入功能&#xff0c;我们现在能够将 MQTT、InfluxDB 中的数据通过规则无缝转换至 TDengine 中&#xff0c;在降低成本的同时&#xff0c;也为用户的数据转换工作提供了极大的便捷性。由于该功能在实现及使用上与 Logstash 类…

库函数qsort的使用及利用冒泡排序模拟实现qsort

文章目录 &#x1f680;前言&#x1f680;void*类型指针&#x1f680;库函数qsort的使用&#x1f680;利用冒泡排序实现库函数qsort() &#x1f680;前言 今天阿辉将为大家介绍库函数qsort的使用&#xff0c;还包括利用冒泡排序模拟实现qsort以及void*类型的指针&#xff0c;关…

【发布小程序配置服务器域名,不配置发布之后访问就会报错request:fail url not in domain list】

小程序在本地开发的时候大家通常会在微信开发者工具中设置“不校验合法域名、web-view (业务域名)、TLS 版本以及HTTPS证书”&#xff0c;久而久之可能会忘掉这个操作&#xff0c;然后打包直接上线发布&#xff0c;结果发现访问会报错request:fail url not in domain list&…

3d家居产品虚拟三维展示提升企业的品牌竞争力

2D展示逐渐难以满足消费者需求&#xff0c;因此基于3D三维展示制作平台将产品或服务以三维形式呈现的3D三维展示更受客户和企业青睐&#xff0c;也大幅提升企业的营销推广效果。那么3D三维展示制作平台如何赋能企业营销推广呢? 首先&#xff0c;3D三维展示制作平台能够提供更加…

【数电笔记】07-基本和复合逻辑运算

目录 说明&#xff1a; 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运算&#xff08;nor&…

分享66个在线客服JS特效,总有一款适合您

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

1、设计模式简介(7大原则,3大类)

设计模式有7个原则&#xff1a;单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成/聚合复用原则、迪米特法则 1&#xff0e;单一职责原则 单一职责原则又称单一功能原则&#xff0c;它规定一个类只有一个职责。如果有多个职责&#xff08;功能&#x…

【Java Web学习笔记】4 - DOM文档对象模型

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/javascript 零、在线文档 JavaScript HTML DOM 一、HTML DOM基本介绍 1. DOM全称是Document Object Model文档对象模型 文档<---映射--->对象 2.就是把文档中的标签&#xff0c;属性&#xf…

正式发布! 加速科技ST2500A飙速赶来!

在新场景、新应用海量增长的驱动下&#xff0c;芯片测试需求也在日益多元化和快速扩展。加速科技始终致力于以客户的实际需求为导向&#xff0c;基于领先的半导体测试技术为千行百业提供全场景的测试解决方案&#xff0c;推出新一代ST2500A数模混合信号测试机。 ST2500A是基于…

通达信KDJ多周期共振指标选股公式,日周月金叉共振

KDJ多周期共振指标基于多个时间周期之间的共振关系来判断股票价格的变化趋势&#xff0c;在不同的周期上&#xff0c;KDJ会呈现出类似的波动形态&#xff0c;当这些波动形态在不同周期上发生共振时&#xff0c;可能会产生较为明显的价格趋势。 具体来说&#xff0c;多周期共振…

MySQL数据库,多表查询

多表查询&#xff0c;也称为关联查询&#xff0c;指两个或多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一&#xff0c;一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&…

介绍一款在线文件格式转换工具

原因: 今天要将一个pdf格式的文件转为docx格式,结果我用破解版的WPS无法再不登录的情况下转换,所以就搜索了一款在线工具实现功能。 网站地址: Convertio — 文件转换器 使用流程: 1)选择要转换的文件 2)选择要转换的格式 3)点击转换 4)等待上传 5)等待转换 6)下载到本地

银行测试:什么是银行数据治理?如何进行有效的银行领域的实际应用?

在数字化时代&#xff0c;数据已经成为银行的重要资产&#xff0c;而数据治理则是确保数据质量、安全性和可用性的关键。那么&#xff0c;什么是银行数据治理&#xff1f;为什么我们需要银行数据治理&#xff1f;又如何进行有效的银行数据治理呢&#xff1f;又有哪些数据治理技…

互联网医院系统|互联网医院打开线上医疗新方向

我们的互联网医院系统采用了最先进的互联网开发技术&#xff0c;包括云计算、大数据、人工智能等。通过这些技术的应用&#xff0c;我们能够为患者和医疗机构提供更加高效、便捷、安全的在线医疗服务。同时&#xff0c;我们的系统还采用了最先进的网络安全技术&#xff0c;保障…