简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🌻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();
@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>