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

106 阅读2分钟

在 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)

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

// 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)的广播。

<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. 准备命令参数:

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

B. 执行命令:

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

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