简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.Android14之BroadCast介绍
- 🌻3.代码实例
- 🐓3.1 发送广播
- 🐓3.2 接收广播
- 🐓3.3 配置广播
🌻1.前言
本篇目的:Android14之广播发送实例
🌻2.Android14之BroadCast介绍
- Android广播机制是一种系统范围内的信息传递方式,它允许应用之间或应用与系统之间进行通信,而不需要知道对方的详细信息。这种机制基于发布者-订阅者模型,通过Intent对象传递广播消息,是Android系统灵活性和动态性的关键特征之一。
- 在Android中,广播分为两类:标准广播和有序广播。
- 标准广播是一种异步广播,被发送后所有注册的接收器几乎同时接收到该广播。这种广播效率较高,但接收器无法阻止广播的进一步传递,也不保证接收器的执行顺序。
- 有序广播则是一种同步广播,被发送后,接收器按照优先级依次接收广播。优先级高的接收器可以先处理广播,并且可以通过abortBroadcast()方法阻止广播继续传递,从而实现广播的拦截。
- 广播机制的核心组件包括:
- 广播发送者:负责发送广播。可以是系统本身,也可以是任何应用。发送广播通常使用Intent对象,并通过sendBroadcast()、sendOrderedBroadcast()等方法实现。
- 广播接收器(BroadcastReceiver):负责接收和处理广播。应用通过定义BroadcastReceiver子类并重写onReceive()方法来接收广播。接收器可以在AndroidManifest.xml中静态注册,也可以在代码中动态注册。
- 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>