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 上已完整工作。**

相关推荐
城东米粉儿6 小时前
Android MediaPlayer 笔记
android
Jony_6 小时前
Android 启动优化方案
android
阿巴斯甜6 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇7 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_11 小时前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_11 小时前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_11 小时前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_11 小时前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_11 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android
_小马快跑_11 小时前
Kotlin协程异常捕获陷阱:try-catch捕获异常失败了?
android