Android 中的广播机制

news2024/11/19 23:25:05

一、Android广播概念:

在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。

二、发送全局广播:

  • 发送广播有两种类型:
    • 标准广播
    • 有序广播

1.标准广播:

完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	//第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendBroadcast()方法将广播发送出去;
        sendBroadcast(intent);
    }
});

2.有序广播:

同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
在这里插入图片描述

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
        //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
        sendOrderedBroadcast(intent,null);
    }
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/

三、接收全局广播:

为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。

1.运行机制:

当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。

2.步骤:

第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法

package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    //检测到广播后会自动回调onReceive方法
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();
    }
}

第二步:注册BroadcastReceiver

  • 动态注册:
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
  • 静态注册:
<!--广播接收器的全限定类名-->
<receiver android:name="com.example.myapplication.MyReceiver"
    android:exported="true">
    <!--过滤机制-->
    <intent-filter>
        <action android:name="my.broadcast.key"/>
    </intent-filter>
</receiver>

3.BroadcastReceiver生命周期:

每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。

四、本地广播:

前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。

1.实现只在本应用内发送广播:

发送广播的具体步骤同(二)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播

localBroadcastManager.sendBroadcast(intent);

2.实现只接收本应用内的广播:

接收广播的具体步骤同(三)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播

localBManager. registerReceiver(localReceiver, intentFilter);

五、案例:广播的接收和发送

注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。

MyReceiver.java:

package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();
    }
}

MainActivity.java:

package com.example.myapplication;

import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn);
        //点击按钮发送广播
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //第一步:将需要广播的消息封装到Intent中
                Intent intent = new Intent();
                intent.putExtra("name","张三");
                //第二步:自定义广播频段,表示该条广播会在那个频段下发出
                intent.setAction("my.broadcast.key");
                //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
                //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
                sendBroadcast(intent);
            }
        });
        //构建IntentFilter标签,设置其Action属性
        IntentFilter filter = new IntentFilter();
        //Action属性指定接收来自哪个频段的广播
        filter.addAction("my.broadcast.key");
        //将IntentFilter装入广播接收器中
        MyReceiver receiver = new MyReceiver();
        //注册广播接收器
        registerReceiver(receiver, filter);
    }
}

效果:

点击按钮发送全局标准广播,并被本应用捕获。
在这里插入图片描述

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

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

相关文章

(附源码)ssm日语学习系统 毕业设计 271621

基于ssm日语学习系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对日语学习等问题&#…

MySQL——表的内容增删查改

文章目录表的增删改查一、Create1、单行全列插入2、多行数据指定列插入3、插入否则更新4、替换二、Retrieve&#x1f60a;(重点)2.1 select 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重2.2 where查询2.3 结果排序2.4 筛选分…

【VC7升级VC8】将vCenter Server 7.X 升级为 vCenter Server 8 (下)—— 升级步骤说明

目录前文说明3. 第一阶段升级&#xff08;1&#xff09;点击【升级】&#xff08;2&#xff09;升级介绍&#xff08;3&#xff09;最终中用户许可协议&#xff08;4&#xff09;连接到源设备&#xff08;5&#xff09;VC7与ESXi 证书警告&#xff08;6&#xff09;vCenter Ser…

【Vue】各种loader的基本配置与使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 目录webpack中的loader  loader概述  打包处理css文件  打包处理less文件  打包处理图片  …

LWIP框架

目录 协议栈分层思想 1. 网络接口层 2. 网络层 3. 传输层 4. 应用层 进程模型 单进程模型 协议栈编程接口 1、Raw/Callback API 2、Netconn API 3、Socket API 协议栈分层思想 TCP/IP协议完整的包含了一系列构成互联网基础的网络协议&#xff0c;TCP/IP协议的开发出…

HTTP Digest Authentication 使用心得

简介 浏览器弹出这个原生的对话框&#xff0c;想必大家都不陌生&#xff0c;就是 HTTP Baisc 认证的机制。 这是浏览器自带的&#xff0c;遵循 RFC2617/7617 协议。但必须指出的是&#xff0c;遇到这界面&#xff0c;不一定是 Basic Authentication&#xff0c;也可能是 Dige…

墨门云终端行为趋势报表,泄密风险提前预警

事件响应滞后&#xff0c;事后再补救&#xff0c;为时晚矣&#xff0c;据IBM的数据泄露成本报告显示&#xff0c;加强风险监测可更快发现数据泄露行为&#xff0c;有效降低企业的数据泄露成本&#xff0c;可见建立完善的风险预警响应机制&#xff0c;可以避免更大的损失&#x…

5G无线技术基础自学系列 | NSA组网场景下移动性管理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 NSA组网场景下移动性管理涉及的相关概念…

js操作二进制数据

使用ArrayBuffer对象保存二进制数据&#xff0c;使用TypedArray和DataView 视图来读写数据。 ArrayBuffer代码内存中的一段数据 const buff new ArrayBuffer(4)这样就创建了一个4(byte)字节的长度的内存判断&#xff0c;初始值都为0 注&#xff1a;一般中文占2个字节&#xff…

葡聚糖修饰Hrps共价三聚肽|葡聚糖修饰CdSe量子点

葡聚糖修饰Hrps共价三聚肽|葡聚糖修饰CdSe量子点 葡聚糖修饰Hrps共价三聚肽 中文名称&#xff1a;葡聚糖修饰Hrps共价三聚肽 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装 溶解性&am…

爆火的 ChatGPT 会让客服岗位消失吗?

近日&#xff0c;由 OpenAI 推出的 ChatGPT 在全球互联网爆火。具体有多火呢&#xff1f;根据 OpenAI 的 CEO Sam Altman 的说法&#xff1a;上周三才上线的 ChatGPT&#xff0c;短短几天&#xff0c;用户数已突破 100 万大关。 那么&#xff0c;ChatGPT 是什么呢&#xff1f;…

无线充电智能车的制作

本文素材来源于宁夏大学 作者&#xff1a;白二曹、王瑞、穆琴、王童兵 指导老师&#xff1a;康彩 一、项目简介 1.功能介绍 无线充电智能车由无线充电、自动控制、红外遥控、网页显示四部分组成。 &#xff08;1&#xff09;流程描述 用户端浏览器访问http://127.0.0.1页面…

Cy5.5 Tyramide,Cyanine5.5 Tyramide,花青素Cy5.5 酪酰胺化学试剂供应

一&#xff1a;产品描述 1、名称 英文&#xff1a;Cy5.5 Tyramide&#xff0c;Cyanine5.5 Tyramide 中文&#xff1a;花青素Cy5.5 酪酰胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Cyanine 4、分子量&#xff1a;738.4 5、分子式&#xff1a;C48H52CIN3O2 6、…

如何用DOS命令设置ip地址及DNS

用DOS命令设置ip地址及DNS 设置/修改IP地址&#xff0c;子网掩码&#xff0c;网关的格式&#xff1a; netsh interface ip set address "本地连接" static 10.25.35.35 255.255.255.0 10.25.35.7 auto[more] 命令的意思是将“本地连接” ip地址设置成 10.25.35.3…

SD NAND 的 SDIO在STM32上的应用详解(下篇)

七.SDIO外设结构体 其实前面关于SDIO寄存器的讲解已经比较详细了&#xff0c;这里再借助于关于SDIO结构体再进行总结一遍。 标准库函数对 SDIO 外设建立了三个初始化结构体&#xff0c;分别为 SDIO 初始化结构体SDIO_InitTypeDef、SDIO 命令初始化结构体 SDIO_CmdInitTypeDef…

Lq93:复原 IP 地址

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011.255.2…

Java基础:Map集合

1. Map集合概述 现实生活中&#xff0c;我们常会看到这样的一种集合&#xff1a;IP地址与主机名&#xff0c;身份证号与个人&#xff0c;系统用户名与系统用户对象等&#xff0c;这种一一对应的关系&#xff0c;就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象…

IOC 容器

IOC 概念和原理 1. 什么是 IOC&#xff1f; 控制饭庄&#xff08; Inversion of Control &#xff0c;缩写为 IOC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08; Depende…

基于SSM的网红书购物商城(源码+论文+开题报告+答辩PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

java实现简单窗口小游戏“扫雷”

前言 忘记是从何处看到过关于扫雷小程序的文章&#xff0c;所以这次也就跟着做一下。其实很简单的&#xff0c;如果有java入门的同学也可以尝试一下自己做这种java小程序。几行代码做几遍基本上能摸清楚这些基础了&#xff0c;对于编程能力也能提高一些。&#xff08;虽然小编…