【实验目的】

  1. 了解使用Intent进行组件通信的原理;
  2. 了解Intent过滤器的原理和匹配机制;
  3. 掌握发送和接收广播的方法

【实验内容】

任务1、普通广播;

任务2、系统广播;

任务3、有序广播;

【实验要求】

1、练习使用静态方法和动态方法注册广播接收器

2、练习发送广播消息的方法;

【实验设计】

src/main/java/com/example/broadcastdemo/:包含所有的Java类文件。

MainActivity.java:应用的主活动,负责发送普通和有序广播。

NormalBroadcastReceiver.java:接收普通广播的接收器。

OrderedBroadcastReceiver.java:接收有序广播的接收器。

src/main/res/:包含资源文件。

layout/:包含布局文件。

activity_main.xml:主活动的布局。

activity_second.xml:第二个活动的布局。

mipmap/:包含应用图标资源。

values/:包含字符串和其他资源值。

AndroidManifest.xml:定义应用的配置,包括活动、接收器等组件。

关键组件:

活动(Activity):

MainActivity:定义了发送广播的按钮和逻辑。

SecondActivity:未在代码中定义,但布局文件存在。

广播接收器(BroadcastReceiver):

NormalBroadcastReceiver:接收自定义的普通广播。

OrderedBroadcastReceiver:接收自定义的有序广播。

布局文件(XML):

activity_main.xml和activity_second.xml:定义了用户界面,包含发送广播的按钮。

【实验结果】

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastdemo">

    <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".SecondActivity"
android:label="@string/app_name" />

<!-- 普通广播接收器 -->
        <receiver android:name=".NormalBroadcastReceiver"
android:exported="false">
            <intent-filter>
                <action android:name="com.example.broadcast.normal" />
            </intent-filter>
        </receiver>

<!-- 系统广播接收器 -->
        <receiver android:name=".SystemBroadcastReceiver"
android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_CHANGED" />
            </intent-filter>
        </receiver>

<!-- 有序广播接收器 -->
        <receiver android:name=".OrderedBroadcastReceiver"
android:exported="false">
            <intent-filter>
                <action android:name="com.example.broadcast.ordered" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MainActivity.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
private NormalBroadcastReceiver normalBroadcastReceiver;
private SystemBroadcastReceiver systemBroadcastReceiver;
private OrderedBroadcastReceiver orderedBroadcastReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// 初始化广播接收器
        normalBroadcastReceiver = new NormalBroadcastReceiver();
systemBroadcastReceiver = new SystemBroadcastReceiver();
orderedBroadcastReceiver = new OrderedBroadcastReceiver();

// 设置按钮监听器
        Button sendNormalBtn = findViewById(R.id.send_normal_btn);
sendNormalBtn.setOnClickListener(view -> sendNormalBroadcast());

Button sendOrderedBtn = findViewById(R.id.send_ordered_btn);
sendOrderedBtn.setOnClickListener(view -> sendOrderedBroadcast());
    }

@Override
protected void onResume() {
super.onResume();
// 动态注册广播接收器
        IntentFilter normalFilter = new IntentFilter("com.example.broadcast.normal");
        registerReceiver(normalBroadcastReceiver, normalFilter);

IntentFilter systemFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(systemBroadcastReceiver, systemFilter);

IntentFilter orderedFilter = new IntentFilter("com.example.broadcast.ordered");
        registerReceiver(orderedBroadcastReceiver, orderedFilter);
    }

@Override
protected void onPause() {
super.onPause();
// 动态注销广播接收器
        unregisterReceiver(normalBroadcastReceiver);
        unregisterReceiver(systemBroadcastReceiver);
        unregisterReceiver(orderedBroadcastReceiver);
    }

// 发送普通广播
    private void sendNormalBroadcast() {
Intent intent = new Intent("com.example.broadcast.normal");
        sendBroadcast(intent);
    }

// 发送有序广播
    private void sendOrderedBroadcast() {
Intent intent = new Intent("com.example.broadcast.ordered");
        sendOrderedBroadcast(intent, null); // null表示没有权限限制
    }
}

NormalBroadcastReceiver.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class NormalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 接收到普通广播后的处理逻辑
        Log.d("Broadcast", "Received normal broadcast");
    }
}

OrderedBroadcastReceiver.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class OrderedBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 接收到有序广播后的处理逻辑
        Log.d("Broadcast", "Received ordered broadcast");
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

    <Button
android:id="@+id/send_normal_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Normal Broadcast"
app:layout_constraintBottom_toTopOf="@+id/send_ordered_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

    <Button
android:id="@+id/send_ordered_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Ordered Broadcast"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/send_normal_btn" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">

    <Button
android:id="@+id/send_normal_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Normal Broadcast"
app:layout_constraintBottom_toTopOf="@+id/send_ordered_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

    <Button
android:id="@+id/send_ordered_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Ordered Broadcast"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/send_normal_btn" />

</androidx.constraintlayout.widget.ConstraintLayout>

【实验分析或心得】

第一部分:Android组件和生命周期

Activity:

MainActivity展示了如何动态注册和注销广播接收器。

活动的生命周期方法(如onCreate、onResume、onPause)用于管理资源和状态。

BroadcastReceiver:

NormalBroadcastReceiver和OrderedBroadcastReceiver展示了如何接收和处理广播。

广播接收器可以是动态注册的,也可以在AndroidManifest.xml中静态声明。

Intent和IntentFilter:

使用Intent发送广播,IntentFilter用于过滤和接收特定的广播。

第二部分:广播机制和应用配置

广播机制:

普通广播(Normal Broadcast):无序发送,所有接收器几乎同时接收。

有序广播(Ordered Broadcast):按优先级顺序发送,可以被拦截和修改。

应用配置:

AndroidManifest.xml定义了应用的组件和权限。

每个组件(如活动、接收器)都需要在清单文件中声明。

资源管理:

布局文件(XML)定义了用户界面,使用ConstraintLayout进行布局设计。

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

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

相关文章

html转word下载

一、插件使用//转html为wordnpm i html-docx-js //保存文件到本地npm i file-saver 注&#xff1a;vite 项目使用esm模式会报错&#xff0c;with方法错误&#xff0c;修改如下&#xff1a;//直接安装修复版本npm i html-docx-fixed二、封装导出 exportWord.jsimport htmlDocx f…

北方公司面试记录

避免被开盒&#xff0c;先称之为“北方公司”&#xff0c;有确定结果后再更名。 先说流程&#xff0c;线下面试&#xff0c;时间非常急&#xff0c;下午两点钟面试&#xff0c;中午十二点打电话让我去&#xff0c;带两份纸质简历。 和一般的菌工单位一样&#xff0c;先在传达室…

linux——ps命令

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND0 1 1 1 ? -1 Ss 0 0:01 /usr/lib/systemd/systemd1 123 123 123 ? -1 S 0 0:00 /usr/sbin/sshd -D123 456 456 456 pts/0 456 R 10…

C#.NET 依赖注入详解

一、是什么 在 C#.NET 中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09; 是一种设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;&#xff0c;以降低代码耦合、提高可测试性和可维护…

Vue监视数据的原理和set()的使用

在 Vue 中&#xff0c;Vue.set()&#xff08;或 this.$set()&#xff09;是用于解决响应式数据更新检测的重要方法&#xff0c;其底层与 Vue 的数据监视原理紧密相关。以下从使用场景和实现原理两方面详细说明&#xff1a;一、Vue.set () 的使用场景与用法1. 为什么需要 Vue.se…

在 Vue 中,如何在回调函数中正确使用 this?

在 Vue 组件中&#xff0c;this 指向当前组件实例&#xff0c;但在回调函数&#xff08;如定时器、异步请求、事件监听等&#xff09;中&#xff0c;this 的指向可能会丢失或改变&#xff0c;导致无法正确访问组件的属性和方法。以下是在回调函数中正确使用 this 的几种常见方式…

第4章唯一ID生成器——4.4 基于数据库的自增主键的趋势递增的唯一ID

基于数据库的自增主键也可以生成趋势递增的唯一 ID&#xff0c;且由于唯一ID不与时间戳关联&#xff0c;所以不会受到时钟回拨问题的影响。 4.4.1 分库分表架构 数据库一般都支持设置自增主键的初始值和自增步长&#xff0c;以MySQL为例&#xff0c;自增主键的自增步长由auto_i…

设计模式:Memento 模式详解

Memento 模式详解Memento&#xff08;备忘录&#xff09;模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获并外部化一个对象的内部状态&#xff0c;以便在之后能够将该对象恢复到原先保存的状态。它广泛应用于需要实现撤销&#xff08;Undo&am…

数据结构(6)单链表算法题(下)

一、环形链表Ⅰ 1、题目描述 https://leetcode.cn/problems/linked-list-cycle 2、算法分析 思路&#xff1a;快慢指针 根据上图所示的流程&#xff0c;我们可以推测出这样一个结论&#xff1a;若链表带环&#xff0c;快慢指针一定会相遇。 那么&#xff0c;这个猜测是否正…

智能制造,从工厂建模,工艺建模,柔性制造,精益制造,生产管控,库存,质量等多方面讲述智能制造的落地方案。

智能制造&#xff0c;从工厂建模&#xff0c;工艺建模&#xff0c;柔性制造&#xff0c;精益制造&#xff0c;生产管控&#xff0c;库存&#xff0c;质量等多方面讲述智能制造的落地方案。

Qt 分裂布局:QSplitter 使用指南

在 GUI 开发中&#xff0c;高效管理窗口空间是提升用户体验的关键。QSplitter 作为 Qt 的核心布局组件&#xff0c;让动态分割窗口变得简单直观。一、QSplitter 核心功能解析 QSplitter 是 Qt 提供的布局管理器&#xff0c;专用于创建可调节的分割区域&#xff1a; 支持水平/垂…

R语言与作物模型(DSSAT模型)技术应用

R语言在DSSAT模型的气候、土壤、管理措施等数据准备&#xff0c;自动化模拟和结果分析上都发挥着重要的作用。一&#xff1a;DSSAT模型的高级应用 1.作物模型的概念 2.DSSAT模型发展现状 3.DSSAT与R语言的安装 4.DSSAT模型的高级应用案例 5.R语言在作物模型参数优化中的应用 6.…

JavaSE:学习输入输出编写简单的程序

一、打印输出到屏幕 Java提供了三种核心输出方法&#xff0c;适合不同场景&#xff1a; System.out.println() 打印内容后 自动换行 System.out.println("Welcome"); System.out.println("to ISS"); // 输出&#xff1a; // Welcome // to ISSSystem.out…

访问者模式感悟

访问者模式 首先有两个东西: 一个是访问者vistor (每一个访问者类都代表了一类操作) 一个是被访问者entity (model /info/pojo/node等等这些都行)也就是是说是一个实体类 其操作方法被抽离给了其他类。 访问者模式的核心思想就是**“把操作从数据结构中分离出来,每种操作…

从零到部署:基于Go和Docker的全栈短链接服务实战(含源码)

摘要&#xff1a;本文将手把手带你使用Go语言&#xff0c;并遵循依赖倒置、分层架构等最佳实践&#xff0c;构建一个高性能、高可用的全栈短链接生成器。项目采用Echo框架、GORM、Redis、MySQL&#xff0c;并通过Docker和Docker Compose实现一键式容器化部署到阿里云服务器。文…

MyBatis_3

上一篇文章&#xff0c;我们学习了使用XML实现MyBatis进行增、删、查、改等操作&#xff0c;本篇文章&#xff0c;我们将学习#{ }和${ }获取方法参数的区别和使用MyBatisXML实现动态SQL语句。 #{ }和${ }的区别 在之前的文章中我们都是使用#{ }进行赋值&#xff0c;但实际上M…

智能图书馆管理系统开发实战系列(一):项目架构设计与技术选型

项目背景 智能图书馆管理系统&#xff08;ILMS&#xff09;是一个现代化的桌面应用程序&#xff0c;采用前后端分离架构&#xff0c;结合了Web技术的灵活性和桌面应用的用户体验。本项目从高保真原型设计开始&#xff0c;经过完整的软件开发生命周期&#xff0c;最终实现为一个…

应急前端“黄金3分钟”设计:极端场景下的操作界面极速搭建技术

摘要**地震突发&#xff0c;应急指挥系统的操作界面却因加载缓慢无法及时调取数据&#xff1b;火灾现场&#xff0c;消防员手持终端的操作步骤繁琐&#xff0c;延误救援时机。在分秒必争的极端场景中&#xff0c;传统前端操作界面为何频频 “掉链子”&#xff1f;怎样才能在 “…

【Android】三种弹窗 Fragment弹窗管理

三三要成为安卓糕手 零&#xff1a;布局转换 在很多工程当中用的都是LinearLayout和relativelayout&#xff0c;这两者都可以转化为Constrainlayout 注&#xff1a;这种用法并不能精确转换&#xff0c;具体还是要根据自己的需求来做布局约束一&#xff1a;snackbar显示弹窗 ((2…

【AI绘画】Stable Diffusion webUI 与 ComfyUI 全解析:安装、模型、插件及功能对比

一、Stable Diffusion 与 UI 工具概述 Stable Diffusion 是当前最主流的开源 AI 绘画模型&#xff0c;通过文本描述生成高质量图像。为降低使用门槛&#xff0c;开发者推出了多种图形界面&#xff08;UI&#xff09;工具&#xff0c;其中AUTOMATIC1111 webUI&#xff08;简称 …