Android Studio App开发之广播组件Broadcast的讲解及实战(包括收发标准、有序、静态广播实现手机震动功能 附源码)

news2025/3/12 9:03:09

一、收发标准广播

Android的广播机制正式借鉴了Wifi的通信原理,不必搭建专门的通路,就能在发送方与接收方之间建立连接,同时广播也是Android的四大组件之一,它用于Android各组件之间的灵活通信,与活动的区别在于以下几点

1:活动只能一对一通信,而广播可以一对多,一人发送广播,多人接收处理

2:对于发送方来说 广播不需要考虑接收放有没有在工作

3:对于接收方来说,因为可能会收到各式各样的广播,所以接收方要过滤符合条件的广播

与广播有关的方法主要有以下三个

1:sendBoradcast  发送广播

2:registerReceiver  注册广播的接收器

3:unregisterReceiver  注销广播的接收器

 广播收发过程可以分为以下三个步骤

1:发送标准广播

2:定义广播接收器

3:开关广播接收器

实战效果如下

点击发送标准广播按钮后即显示收到了广播

 

 代码如下

Java类代码

package com.example.chapter09;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter09.util.DateUtil;

public class BroadStandardActivity extends AppCompatActivity implements View.OnClickListener {
    private final static String TAG = "BroadStandardActivity";
    // 这是广播的动作名称,发送广播和接收广播都以它作为接头暗号
    private final static String STANDARD_ACTION = "com.example.chapter09.standard";
    private TextView tv_standard; // 声明一个文本视图对象
    private String mDesc = "这里查看标准广播的收听信息";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_standard);
        tv_standard = findViewById(R.id.tv_standard);
        tv_standard.setText(mDesc);
        findViewById(R.id.btn_send_standard).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_send_standard) {
            Intent intent = new Intent(STANDARD_ACTION); // 创建指定动作的意图
            sendBroadcast(intent); // 发送标准广播
        }
    }

    private StandardReceiver standardReceiver; // 声明一个标准广播的接收器实例
    @Override
    protected void onStart() {
        super.onStart();
        standardReceiver = new StandardReceiver(); // 创建一个标准广播的接收器
        // 创建一个意图过滤器,只处理STANDARD_ACTION的广播
        IntentFilter filter = new IntentFilter(STANDARD_ACTION);
        registerReceiver(standardReceiver, filter); // 注册接收器,注册之后才能正常接收广播
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(standardReceiver); // 注销接收器,注销之后就不再接收广播
    }

    // 定义一个标准广播的接收器
    private class StandardReceiver extends BroadcastReceiver {
        // 一旦接收到标准广播,马上触发接收器的onReceive方法
        @Override
        public void onReceive(Context context, Intent intent) {
            // 广播意图非空,且接头暗号正确
            if (intent != null && intent.getAction().equals(STANDARD_ACTION)) {
                mDesc = String.format("%s\n%s 收到一个标准广播", mDesc, DateUtil.getNowTime());
                tv_standard.setText(mDesc);
            }
        }
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <Button
        android:id="@+id/btn_send_standard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="发送标准广播"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:id="@+id/tv_standard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textColor="@color/black"
        android:textSize="17sp" />

</LinearLayout>

二、收发有序广播

一个广播存在多个接收器,这些接收器需要排队收听广播,这意味着该广播是条有序广播,

先收到广播的接收器A,既可以让其他接收器继续收听广播,也可以中断广播不让其他接收器收听

实现有序广播的收发,需要完成以下三个步骤

1:发送广播时要注明这是一个有序广播

2:定义有序广播的接收器

3:注册有序广播的多个接收器

效果如下

 

点击接收后中断广播那么只有B接收到了广播,A没有

 

 代码如下

Java类

package com.example.chapter09;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter09.util.DateUtil;

public class BroadOrderActivity extends AppCompatActivity implements View.OnClickListener {
    private final static String TAG = "BroadOrderActivity";
    private final static String ORDER_ACTION = "com.example.chapter09.order";
    private CheckBox ck_abort;
    private TextView tv_order;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_order);
        ck_abort = findViewById(R.id.ck_abort);
        tv_order = findViewById(R.id.tv_order);
        findViewById(R.id.btn_send_order).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_send_order) {
            tv_order.setText("");
            Intent intent = new Intent(ORDER_ACTION); // 创建一个指定动作的意图
            sendOrderedBroadcast(intent, null); // 发送有序广播
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        // 多个接收器处理有序广播的顺序规则为:
        // 1、优先级越大的接收器,越早收到有序广播;
        // 2、优先级相同的时候,越早注册的接收器越早收到有序广播
        orderAReceiver = new OrderAReceiver(); // 创建一个有序广播的接收器A
        // 创建一个意图过滤器A,只处理ORDER_ACTION的广播
        IntentFilter filterA = new IntentFilter(ORDER_ACTION);
        filterA.setPriority(8); // 设置过滤器A的优先级,数值越大优先级越高
        registerReceiver(orderAReceiver, filterA); // 注册接收器A,注册之后才能正常接收广播
        orderBReceiver = new OrderBReceiver(); // 创建一个有序广播的接收器B
        // 创建一个意图过滤器A,只处理ORDER_ACTION的广播
        IntentFilter filterB = new IntentFilter(ORDER_ACTION);
        filterB.setPriority(10); // 设置过滤器B的优先级,数值越大优先级越高
        registerReceiver(orderBReceiver, filterB); // 注册接收器B,注册之后才能正常接收广播
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(orderAReceiver); // 注销接收器A,注销之后就不再接收广播
        unregisterReceiver(orderBReceiver); // 注销接收器B,注销之后就不再接收广播
    }

    private OrderAReceiver orderAReceiver; // 声明有序广播接收器A的实例
    // 定义一个有序广播的接收器A
    private class OrderAReceiver extends BroadcastReceiver {
        // 一旦接收到有序广播,马上触发接收器的onReceive方法
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null && intent.getAction().equals(ORDER_ACTION)) {
                String desc = String.format("%s%s 接收器A收到一个有序广播\n",
                        tv_order.getText().toString(), DateUtil.getNowTime());
                tv_order.setText(desc);
                if (ck_abort.isChecked()) {
                    abortBroadcast(); // 中断广播,此时后面的接收器无法收到该广播
                }
            }
        }
    }

    private OrderBReceiver orderBReceiver; // 声明有序广播接收器B的实例
    // 定义一个有序广播的接收器B
    private class OrderBReceiver extends BroadcastReceiver {
        // 一旦接收到有序广播B,马上触发接收器的onReceive方法
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null && intent.getAction().equals(ORDER_ACTION)) {
                String desc = String.format("%s%s 接收器B收到一个有序广播\n",
                        tv_order.getText().toString(), DateUtil.getNowTime());
                tv_order.setText(desc);
                if (ck_abort.isChecked()) {
                    abortBroadcast(); // 中断广播,此时后面的接收器无法收到该广播
                }
            }
        }
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <CheckBox
        android:id="@+id/ck_abort"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left|center"
        android:checked="false"
        android:text="接收之后是否中断广播"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <Button
        android:id="@+id/btn_send_order"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="发送有序广播"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:id="@+id/tv_order"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textColor="@color/black"
        android:textSize="17sp" />

</LinearLayout>

三、收发静态广播

静态广播在现在的Android中比较少用,因为不太安全 下面看看效果即可 实现了手机的震动功能

java类代码如下

package com.example.chapter09;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter09.receiver.ShockReceiver;

public class BroadStaticActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_static);
        findViewById(R.id.btn_send_shock).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_send_shock) {
            // Android8.0之后删除了大部分静态注册,防止退出App后仍在接收广播,
            // 为了让应用能够继续接收静态广播,需要给静态注册的广播指定包名。
            String receiverPath = "com.example.chapter09.receiver.ShockReceiver";
            Intent intent = new Intent(ShockReceiver.SHOCK_ACTION); // 创建一个指定动作的意图
            // 发送静态广播之时,需要通过setComponent方法指定接收器的完整路径
            ComponentName componentName  = new ComponentName(this, receiverPath);
            intent.setComponent(componentName); // 设置意图的组件信息
            sendBroadcast(intent); // 发送静态广播
            Toast.makeText(this, "已发送震动广播", Toast.LENGTH_SHORT).show();
        }
    }
}

 

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

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

相关文章

荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5,荧光素FITC标记的FRTL-5细胞,FITC-FRTL-5

产品名称&#xff1a;荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5&#xff0c;荧光素FITC标记的FRTL-5细胞 英文名称&#xff1a;FITC-FRTL-5 在F-12培养基中加入5&#xff05;小牛血清、10mU/ml TSH、10g/ml胰岛素、5g/ml转铁蛋白、10ng/ml生长抑素、0.4ng/ml氢化可的松、10ng/…

JAVA虚拟机的性能监控

一、JDK的命令行工具 命令一&#xff1a;jps&#xff08;虚拟机进程状况工具&#xff09; jps -q //只输出LVMID&#xff0c;省略主类的名称&#xff08;LVMID&#xff1a;虚拟机实例运行时候的进程号&#xff09; jps -m //输出虚拟机进程启动的时传递给主类main()函数的参…

笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?

随着互联网时代的发展&#xff0c;电脑的应用越来越广泛&#xff0c;已经深深融入了我们的工作乃至生活当中。其中&#xff0c;笔记本作为可随身携带的电脑设备&#xff0c;其灵活、轻便等优势一直深受大家喜爱。在日常使用过程中&#xff0c;我们会往笔记本里存储各式各样的数…

Springboot快速开发-书本信息管理系统(项目源码)

【我后续会发一个资源包&#xff0c;里面是所有代码&#xff0c;数据库表设计也有&#xff0c;大学生可以直接用&#xff0c;导入数据库运行&#xff0c;再导入后端项目和前端项目&#xff0c;再去网页运行就好了&#xff0c;效果图下面有】 1、考核要求&#xff1a; 数据库&am…

笔试强训第22天--(第一个只出现一次的字符 小易的升级之路)

选择 B 从头找和从尾找不都得遍历嘛 B 错了建议给自己来个大嘴巴子 C 老演员了 A 一个从头来&#xff0c;一个从尾来&#xff0c;这样才能全满嘛 A 从1开始存的 但是依然是头指针等于尾指针的时候是空&#xff0c;但是你不留一个空间不存数据&#xff0c;那满的时候也是头指针等…

HAWE油缸_哈威油缸

HAWE油缸_哈威油缸宁波秉圣主要做的型号:HSE24-20,HSE16-8,HSE12-8,HSA32-20&#xff0c;HSE16-16&#xff0c;SHA32-20&#xff0c;SHA40-25等。 HAWE防爆阀宁波秉圣常作的型号:EXGZ4-12-GM24,NSWP2D/M/20-G24EX,VP1Z-G24EX,NBVP16R/2-G24EX,PSL41/160-3-E1-G24EX-3m,PSV4S2/2…

期末前端web大作业——名侦探柯南网页制作 Hbuiderx制作网页 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

32岁事业无成,我终于选择放过自己了

作为一名热爱编程的程序员&#xff0c;我一直在思考&#xff0c;既然我热爱这份职业&#xff0c;如果我能在工作中获得人生意义&#xff0c;岂不是两全其美。于是&#xff0c;我去看了一本书《发现你的天赋》。很多人评价&#xff0c;照着上面的引导认真做题&#xff0c;不仅能…

springboot2.X整合mybatis使用joda时间格式变量完成插入操作

开发工具使用的idea2022.3&#xff0c;数据库是mysql5.X系列&#xff0c;springboot用的是2.7系列&#xff0c;使用了java8的joda类型的时间格式完成mybatis的插入操作。下面贴代码说明实现过程 项目结构如下图&#xff1a; 下面说一些关键的maven配置 <!-- springboot myb…

如何检测和克服MLOps中的模型漂移

image.png机器学习 (ML) 被广泛认为是数字化转型的基石&#xff0c;但 ML 模型最容易受到数字环境变化动态的影响。 ML 模型由创建它们的时间段内可用的变量和参数定义和优化。 让我们看看一个基于垃圾邮件的通用模板创建的 ML 模型的案例&#xff0c;该模板当时可能正在激增。…

安装【银河麒麟V10】linux系统

最近客户的服务器是麒麟的操作系统&#xff0c;因为要在上面安装我们的应用所以&#xff0c;要找镜像在本地搭建测试环境&#xff0c;看看有什么问题&#xff0c;把遇到的问题和操作总结一下。因为客户的服务器是内网&#xff0c;没网还需要挂载镜像&#xff0c;所以还需要挂载…

Linux命令从入门到实战 ---- 磁盘管理类

du 查看文件和目录占用的磁盘空间 du disk usage 磁盘占用情况 基本语法 du [选项] 目录/文件 显示目录下每个子目录的磁盘使用情况 选项功能-h将文件大小转换成人类便于阅读的形式-a查看子目录和文件-c显示所有的文件和子文件后&#xff0c;显示总和-s只显示总和–max-depth…

docker-compse整合redis集群

这里写自定义目录标题配置配置、数据和logs目录配置docker-compose配置集群总结本文是通过docker-compose在linux配置redis高可用。前提条件是系统中需要安装docker和docker-compose。配置配置、数据和logs目录 mkdir -p /home/docker-redis在当前目录下创建cluster-conf.conf…

回溯法求解n个元素的集合的幂集

目录 1.回溯法 2.集合的幂集本质问题 3.集合的幂集 &#xff08;1&#xff09;集合 &#xff08;2&#xff09;求解集合的幂集 &#xff08;3&#xff09;算法描述 &#xff08;4&#xff09;算法实现 &#xff08;5&#xff09;算法拓展 1.回溯法 回溯法也是设计递归…

Android App开发实战之实现微信记账本(附源码 超详细必看)

需要源码或图片集请点赞关注收藏后评论区留言~~~ 一、需求描述 好用的记账本必须具备两项基本功能。一项时记录新帐单&#xff0c;另一项时查看账单列表&#xff0c;其中账单的记录操作要求用户输入账单的明细要素&#xff0c;包括账单的发生时间&#xff0c;账单的收支类型&a…

C++ 输入输出及txt文件输入示例

std::istream typedef basic_istream<char> istream;输入流对象可以读取和解释来自字符序列的输入。 提供了特定的成员来执行这些输入操作&#xff08;参见下面的函数&#xff09;。 标准对象 cin 就是这种类型的对象。 std::istream::getline istream& getline (…

Web3 用例全解析:传统品牌加速进入 Web3 的原因?

Web3 有能力彻底改变品牌和客户相互联系的方式。许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度&#xff0c;这是传统社交媒体和电子商务渠道根本无法做到的。 NIKE、Panini 和 Vodafone 是最早认识到 NFT 价值的公司&#xff0c;而 Gucci、Balmain、Prad…

C语言百日刷题第七天

C语言百日刷题第七天61. 写一个函数isPowerOfTwo判断是不是2的幂次方62. 写一个函数isPowerOfThree判断是不是3的幂次方63.n 的第 k 个因子64.有效的完全平方数65.搜索旋转排序数组66.桌上拿硬币67.计算生成元68.计算分子量69.最佳情侣身高差70.拯救外星人61. 写一个函数isPowe…

计算机毕业设计springboot+vue+elementUI校园疫情防控系统

项目介绍 基本实现了校园疫情防控系统应有的主要功能模块&#xff0c;本系统有管理员、学生。管理员&#xff1a;首页、个人中心、核酸检测管理、体温状态管理、学生管理、学生状态管理、休假申请管理、出入登记管理、疫情知识管理、论坛管理、系统管理。学生权限&#xff1b;…

矩阵分析与计算学习记录-广义逆矩阵

本章重点内容&#xff1a; Penrose方程 {1}-逆的计算及性质 Moore-Penrose逆的计算及性质 tips&#xff1a;广义逆矩阵是在系数矩阵不可逆的情况下进行求解 1. Penrose方程 1.1 广义逆的定义与计算 1.2 Penrose方程基本概念 2. {1}-逆的计算及性质 2.1 {1}-逆的计算 2.2 …