在 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
- Logcat 输出:
代码段
D/CustomReceiver: ✅ 接收到自定义广播: com.example.action.CUSTOM_REFRESH
D/CustomReceiver: 接收到的数据 Payload: full_sync
如果 Logcat 出现了这些信息,说明您的自定义广播在 Android 13 上已完整工作。**