当前位置: 首页 > news >正文

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

简介: 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();@Overrideprotected 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() {@Overridepublic 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";@Overridepublic 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" /><applicationandroid: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"><activityandroid: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>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 适合销售使用的记录客户的备忘录软件
  • 大陆居民在香港纳税政策
  • 【Mybatis整合Oracle】在 xml 文件中 WITH 子句的简单使用
  • 像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包
  • BGP选路之Next Hop
  • maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行
  • v-for 进行列表的 增删改查
  • nodejs -会话控制学习笔记
  • 结合el-upload上传组件,验证文件格式及大小
  • h5图片压缩后变为base64格式的流地址上传服务器
  • SpringBoot自动配置(面试重点)
  • C++ 代码实现socket 类使用TCP/IP进行通信 (windows 系统)
  • react18+
  • GO Channel使用详解(各种场景下的最佳实践)
  • 【Unity】关于Luban的简单使用
  • Centos6.8 使用rpm安装mysql5.7
  • JDK9: 集成 Jshell 和 Maven 项目.
  • jquery cookie
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • mac修复ab及siege安装
  • MySQL的数据类型
  • Netty 4.1 源代码学习:线程模型
  • PV统计优化设计
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 官方解决所有 npm 全局安装权限问题
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前端_面试
  • 什么软件可以剪辑音乐?
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一道面试题引发的“血案”
  • 自动记录MySQL慢查询快照脚本
  • 2017年360最后一道编程题
  • Prometheus VS InfluxDB
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Kafka_深入探秘者(2):kafka 生产者
  • #162 (Div. 2)
  • #数学建模# 线性规划问题的Matlab求解
  • (02)vite环境变量配置
  • (10)STL算法之搜索(二) 二分查找
  • (16)Reactor的测试——响应式Spring的道法术器
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (七)glDrawArry绘制
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 7和core版 SignalR
  • .NET CLR基本术语
  • .NET Core 成都线下面基会拉开序幕
  • .NET Framework 3.5安装教程
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net程序帮助文档制作
  • .NET多线程执行函数