自学内容网 自学内容网

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

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

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

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

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

欢迎关注Android系统攻城狮

🌻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>

原文地址:https://blog.csdn.net/u010164190/article/details/140555845

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!