Android14之调试广播实例(二百二十五)

news2024/12/23 14:47:06

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Android14之BroadCast介绍
    • 🌻3.代码实例
      • 🐓3.1 发送广播
      • 🐓3.2 接收广播
      • 🐓3.3 配置广播

🌻1.前言

本篇目的:Android14之广播发送实例

🌻2.Android14之BroadCast介绍

  • Android广播机制是一种系统范围内的信息传递方式,它允许应用之间或应用与系统之间进行通信,而不需要知道对方的详细信息。这种机制基于发布者-订阅者模型,通过Intent对象传递广播消息,是Android系统灵活性和动态性的关键特征之一。
  • 在Android中,广播分为两类:标准广播和有序广播。
  • 标准广播是一种异步广播,被发送后所有注册的接收器几乎同时接收到该广播。这种广播效率较高,但接收器无法阻止广播的进一步传递,也不保证接收器的执行顺序。
  • 有序广播则是一种同步广播,被发送后,接收器按照优先级依次接收广播。优先级高的接收器可以先处理广播,并且可以通过abortBroadcast()方法阻止广播继续传递,从而实现广播的拦截。
  • 广播机制的核心组件包括:
  1. 广播发送者:负责发送广播。可以是系统本身,也可以是任何应用。发送广播通常使用Intent对象,并通过sendBroadcast()、sendOrderedBroadcast()等方法实现。
  2. 广播接收器(BroadcastReceiver):负责接收和处理广播。应用通过定义BroadcastReceiver子类并重写onReceive()方法来接收广播。接收器可以在AndroidManifest.xml中静态注册,也可以在代码中动态注册。
  3. Intent:广播的载体,包含了广播的类型和可选的数据。Intent可以是显式的,指定接收器的类名;也可以是隐式的,通过action字符串匹配接收器。
  • 广播机制的使用场景非常广泛:
  • 系统事件通知:例如,当电池电量发生变化、屏幕解锁、收到短信时,系统会发送广播通知应用。
  • 应用间通信:应用可以发送自定义广播,让其他应用知道某些事件的发生,实现应用间的数据共享或协同工作。
  • 后台服务:应用可以在后台监听特定广播,以便在特定条件下执行任务,如定时任务或网络状态变化响应。
    尽管广播机制强大,但也存在一些限制和注意事项:
  • 性能影响:频繁的广播可能导致性能问题,因此应合理使用广播。
  • 安全问题:广播可能会被其他应用接收,因此敏感信息不应通过广播传递。
  • Android版本差异:不同版本的Android对广播机制的支持有所不同,如Android 8.0(API 级别 26)引入了限制后台执行的限制,影响了静态注册的广播接收器。
  • Android广播机制为应用间的通信提供了一种简单而有效的方式,通过Intent传递消息,BroadcastReceiver接收和处理消息,实现了系统内外的灵活交互。然而,开发者在使用时需要注意性能和安全问题,并适应不同Android版本的变化。

🌻3.代码实例

🐓3.1 发送广播

  • MainActivity.java
package com.example.broadcastdemo;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private BroadcastReceiver audioControlReceiver = new AudioControlReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnStart = findViewById(R.id.buttonStart);
        Button btnStop = findViewById(R.id.buttonStop);

        // 动态注册广播接收器
        IntentFilter filter = new IntentFilter(AudioControlReceiver.STREAM_VOLUME_CHANGE);
        registerReceiver(audioControlReceiver, filter);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 发送测试广播
                Intent intent = new Intent(AudioControlReceiver.STREAM_VOLUME_CHANGE);
                intent.putExtra(AudioControlReceiver.STREAM_TYPE, 1);
                intent.putExtra(AudioControlReceiver.USAGE, 1);
                intent.putExtra(AudioControlReceiver.MUTE, true);
                intent.putExtra(AudioControlReceiver.GROUPID, 3);
                sendBroadcast(intent);

                Log.d(TAG,"xxx------------> "+new Exception().getStackTrace()[0].getFileName()+", "
                        +new Exception().getStackTrace()[0].getMethodName()+"() , line = "
                        +new Exception().getStackTrace()[0].getLineNumber()
                );
            }
        });
    }
}

🐓3.2 接收广播

  • AudioControlReceiver.java
package com.example.broadcastdemo;

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

public class AudioControlReceiver extends BroadcastReceiver {
    private static final String TAG = "AudioControlReceiver";

    public static String STREAM_VOLUME_CHANGE = "STREAM_VOLUME_CHANGED_ACTION";
    public static String STREAM_TYPE = "STREAMTYPE";
    public static String USAGE ="USAGE";
    public static String MUTE = "MUTE";
    public static String GROUPID = "GROUPID";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && STREAM_VOLUME_CHANGE.equals(intent.getAction())) {
            int streamType = intent.getIntExtra(STREAM_TYPE, -1);
            int usage = intent.getIntExtra(USAGE, -1);
            int groupId = intent.getIntExtra(GROUPID, -1);
            boolean mute = intent.getBooleanExtra(MUTE, false);

            Log.d(TAG, "xxx-----> Received broadcast: action = " + intent.getAction());
            Log.d(TAG, "xxx-----> Received broadcast: groupId = " + groupId + ", mute =" + mute + ", usgae = " + usage + ", streamType = " + streamType);
        }
    }
}

🐓3.3 配置广播

  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BroadcastDemo"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:theme="@style/Theme.BroadcastDemo">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".AudioControlReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="STREAM_VOLUME_CHANGED_ACTION" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

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

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

相关文章

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点&#xff1a; 2.2 显示进程信息&#xff1a; 2.3 守护进程和后台进程的区别&#xff1a; 2.4 创建守护进程的步骤和守护进程的特征&#xff1a; 2.4.1 创建守护进程的步骤&#xff1a; 2.4.2 守…

京东Android一面凉经(2024)

京东Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《京东Android一面凉经(2024)》。 面试职位: Android开发工程师 技术一面 面试时长: 50…

Plant simulation 中快速创建相同属性轨道的方法

问题&#xff1a;默认的轨道宽度是0.3m&#xff0c;默认轨道是水平的。如果要创建大量宽度1m&#xff0c;竖着的轨道有没有效率的方法呢&#xff1f;答案肯定是有的&#xff0c;按下面方法操作即可。 1、复制两个轨道模型到用户对象中&#xff0c;命名为水平轨道和竖直轨道。 …

开源免费的一个企业级商城系统

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 系统简介 ShopXO&#xff1a; 是一款企业级免费开源商城系统&#xff0c;具备可视化DIY拖拽装修功能&#xff0…

[240720] X-CMD 发布 v0.4.1:新增 OpenAI GPT-4o mini 模型|优化 df ip dns ...

目录 X-CMD 发布 v0.4.1✨ openai✨ chat✨ df✨ ip✨ kev✨ dns✨ shodan✨ pick✨ theme X-CMD 发布 v0.4.1 ✨ openai 更新 X-CMD 现已支持 OpenAI 最新模型 GPT-4o mini&#xff01; &#x1f389; 用户只需使用 gpt4om 即可直接调用这款强大的模型。gpt 的默认模型由 g…

PyTorch张量数值计算

文章目录 1、张量基本运算2、阿达玛积3、点积运算4、指定运算设备⭐5、解决在GPU运行PyTorch的问题 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&am…

计算机的错误计算(三十二)

摘要 在计算机的错误计算&#xff08;二十八&#xff09;与&#xff08;三十 一&#xff09;中&#xff0c;我们探讨了 Visual Studio 对 6个随机exp(x)函数的计算精度问题。根据网友的反馈&#xff0c;本节将展示 Python 对它们的输出&#xff1a;结果几乎与 Visual Studio …

C# —— CRC16 算法

CRC16:即循环冗余校验码。数据通信当中一种常用的查错校验码 其特征信息字段和校验字段的长度可以是任意选定的&#xff0c;对数据进行指定多项式计算 并且将得到的结果附加在帧的后面&#xff0c;接受的设备也执行类似的算法&#xff0c;以保证数据传输的正确性和完整性 crc…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体&#xff0c;ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处&#xff1a; ELK 组件在大数据运维系统中&#xff0c;主要可解决的问题如下&…

录取查询老师在哪里制作?

随着考试的落幕&#xff0c;家长们焦急等待的心情终于可以稍微缓解&#xff0c;因为录取结果即将揭晓。然而&#xff0c;对于老师来说&#xff0c;这仅仅是另一项繁重工作的开始。他们需要将每一份录取通知单逐一发送给学生家长&#xff0c;这个过程不仅耗时而且容易出错。面对…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录 浮点数存储规则 单\双精度浮点数 存储 S、M、E 的布局 有效数字M 和 指数位E 的特殊规定 浮点数在内存中是否存储的S、M、E 浮点数存储规则 根据国际标准IEEE754&#xff08;电气和电子工程协会&#xff09;规定&#xff1a;任意一个 浮点数F的二进制 都可以表示成…

19集 两款ESP32开发板如何选择?-《MCU嵌入式AI开发笔记》

19集 两款ESP32开发板我们用哪款&#xff1f;-《MCU嵌入式AI开发笔记》 有两款ESP32的开发板分别是ESP32 S3 和C3的&#xff0c;我们该如何选择&#xff1f; 1、ESP32-S3-BOX-3 在乐鑫官网上&#xff0c;https://www.espressif.com.cn/zh-hans/products/devkits 有ESP32S3 B…

Unity UGUI 之 Canvas画布

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.UGUI是什么 首先官方手册导向了这两个连接&#xff0c;里面是ugui的基本教程 帆布 |U…

【全面升级!短视频运营利器揭秘】短视频矩阵系统

短视频矩阵通常是指一种内容分发策略&#xff0c;它通过构建一个包含多种不同类型、主题或风格短视频的内容平台架构。这个矩阵可能会包括搞笑、教育、音乐、美食、旅游等各种短视频形式&#xff0c;让用户可以根据兴趣选择观看。每个视频可以视为矩阵中的一个节点&#xff0c;…

JVM-垃圾回收与内存分配

目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?&#xff08;句柄和直接指针&#xff09; Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word&#xff08;hashcode、分代、锁标志位&#xff09;、…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…

记录|C# winform布局学习

目录 前言一、自适应布局Step1. 添加AutoAdaptWindowsSize类Step2. Form中引用Step3. 创建SizeChanged事件函数Step4. 在Fram.Disiger中添加 更新时间 前言 参考视频&#xff1a; C#5分钟winform快速自适应布局 参考文章&#xff1a; 其他参考&#xff1a; 写这篇文章&#xff…

【python学习】python的知识点总结、特点和思考及解答(代码示例)

引言 python 是一种高级编程语言&#xff0c;具有简洁的语法和丰富的库&#xff0c;被广泛应用于Web开发、数据分析、人工智能、科学计算等领域 文章目录 引言一、python知识点总结1.1 基础语法1.1.1 变量和数据类型1.1.2 控制结构1.1.3 函数和模块 1.2 面向对象编程1.2.1 类和…