Android 13 (API 33)上自定义广播

在 Android 13 (API 33) 及更高版本上,由于 Google 对隐式广播和安全性进行了严格限制,我们需要使用最佳实践来确保自定义广播的完整性和可靠性。下面是一个完整的自定义显式广播示例,包括 Kotlin 接收器代码、AndroidManifest.xml 配置以及 adb 测试命令。

🛠️ Android 13 自定义显式广播示例

1. 定义常量 (Constants)

在一个 Kotlin 文件中定义 Action 名称和所需的权限。

Kotlin

// Constants.kt

const val ACTION_CUSTOM_REFRESH = "com.example.action.CUSTOM_REFRESH"

const val EXTRA_DATA_KEY = "data_payload"

2. 编写 BroadcastReceiver (Kotlin)

这是接收广播并处理逻辑的核心类。

kotlin 复制代码
// CustomDataReceiver.kt  
package com.example.myautomotiveapp  
  
import android.content.BroadcastReceiver  
import android.content.Context  
import android.content.Intent  
import android.util.Log  
  
class CustomDataReceiver : BroadcastReceiver() {  
  
    private val TAG = "CustomReceiver"  
  
    override fun onReceive(context: Context?, intent: Intent?) {  
        // 必须检查 Intent 是否为 null  
        if (intent == null) return  
  
        val action = intent.action  
         
        // 1. 检查 Action 是否匹配  
        if (action == ACTION_CUSTOM_REFRESH) {  
             
            // 2. 提取附加数据  
            val payload = intent.getStringExtra(EXTRA_DATA_KEY)  
             
            Log.d(TAG, "✅ 接收到自定义广播: $ACTION_CUSTOM_REFRESH")  
            Log.d(TAG, "   接收到的数据 Payload: $payload")  
  
            // 3. 执行应用逻辑 (例如:刷新 UI, 更新数据)  
            // if (payload == "full_sync") { /* 执行同步操作 */ }  
             
            // 4. (可选) 如果是耗时操作,通常会启动一个 JobIntentService 或 WorkManager  
        } else {  
            Log.w(TAG, "接收到不匹配的 Action: $action")  
        }  
    }  
}  

3. 配置 Manifest (AndroidManifest.xml)

在 Android 13 上,必须明确设置 android:exported 属性,以便接收来自系统或外部(adb)的广播。

ini 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android">  
    <application>  
         
        <receiver  
            android:name=".CustomDataReceiver"  
            android:enabled="true"  
            android:exported="true"> <intent-filter>  
                <action android:name="com.example.action.CUSTOM_REFRESH" />  
            </intent-filter>  
        </receiver>  
         
    </application>  
</manifest>  

4. 使用 ADB 命令测试广播

现在,您可以使用 adb shell am broadcast 命令来模拟外部系统发送广播。

A. 准备命令参数:

参数 含义
-a com.example.action.CUSTOM_REFRESH 指定 Action 名称
-p com.example.myautomotiveapp 关键: 指定目标应用的包名 (显式广播)
--es "data_payload" "full_sync" 发送一个名为 data_payload 的字符串附加数据

B. 执行命令:

请将 com.example.myautomotiveapp 替换为您应用的实际包名。

css 复制代码
adb shell am broadcast \  
    -a com.example.action.CUSTOM_REFRESH \  
    -p com.example.myautomotiveapp \  
    --es "data_payload" "full_sync"  

C. 验证结果:

在执行命令后,立即检查 Logcat。您应该能看到:1. ADB 输出: Broadcast completed: result=0

  1. Logcat 输出:
    代码段
    D/CustomReceiver: ✅ 接收到自定义广播: com.example.action.CUSTOM_REFRESH
    D/CustomReceiver: 接收到的数据 Payload: full_sync

如果 Logcat 出现了这些信息,说明您的自定义广播在 Android 13 上已完整工作。**

相关推荐
我命由我123456 分钟前
Android Jetpack Compose - TopAppBar、BottomAppBar、Scaffold
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
REDcker21 分钟前
Android WebView 升级 - WebViewUpgrade 库使用详解
android·华为·harmonyos·webview
我命由我1234537 分钟前
Android Studio - Android Studio 去除 import 的未使用的类
android·java·ide·学习·java-ee·android studio·学习方法
ii_best42 分钟前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
BD_Marathon1 小时前
SpringMVC——5种类型参数传递
android·java·数据库
a3158238061 小时前
Android 大图显示策略优化显示(二)
android·java·开发语言·javascript·kotlin·glide·图片加载
火柴就是我2 小时前
Flutter 混合模式下:saveLayer 混合注意点
android·flutter
Mintopia2 小时前
🎙️ React Native(RN)语音输入场景全解析
android·react native·aigc
centor2 小时前
国际版 UnitySetup-Android-Support 安装 Mac 设备
android·macos
城东米粉儿2 小时前
compose 中的附带效应笔记一
android