一句话总结:
可以,但有条件!程序A必须注册对应的广播接收器,程序B要发送全局广播,并且注意Android版本限制和权限控制,否则收不到!
详细条件与步骤
1. 程序B发送全局广播(隐式Intent)
// 程序B发送广播
val intent = Intent("com.example.MY_CUSTOM_ACTION")
intent.putExtra("data", "Hello from App B")
sendBroadcast(intent)
2. 程序A注册广播接收器(静态或动态)
-
方式1:静态注册(AndroidManifest.xml)
<!-- 程序A的 AndroidManifest.xml --> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.MY_CUSTOM_ACTION" /> </intent-filter> </receiver>注意:Android 8.0+ 限制隐式广播的静态注册!
-
方式2:动态注册(代码中)
// 程序A的 Activity 或 Service 中 private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val data = intent?.getStringExtra("data") Log.d("AppA", "收到广播:$data") } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val filter = IntentFilter("com.example.MY_CUSTOM_ACTION") registerReceiver(receiver, filter) } override fun onDestroy() { super.onDestroy() unregisterReceiver(receiver) // 防止内存泄漏 }
Android 8.0+ 的限制与解决方案
问题:
- Android 8.0(API 26)及以上,禁止通过清单文件静态注册大部分隐式广播(防止滥用后台唤醒)。
- 豁免的广播:部分系统广播(如开机完成、时区变化)仍可静态注册。
解决方案:
-
使用动态注册:确保程序A在前台运行(如 Activity 或前台 Service)。
-
发送显式广播(不推荐) :指定目标应用的包名或组件名(需知道程序A的详细信息)。
// 程序B发送显式广播 val intent = Intent("com.example.MY_CUSTOM_ACTION") intent.setPackage("com.example.appA") // 指定程序A的包名 sendBroadcast(intent) -
使用权限控制:定义自定义权限,确保只有授权应用能收发广播。
增强安全性:自定义权限
步骤1:在程序B的 AndroidManifest.xml 定义权限
<!-- 程序B的 AndroidManifest.xml -->
<permission
android:name="com.example.MY_PERMISSION"
android:protectionLevel="signature" /> <!-- 仅相同签名的应用可用 -->
步骤2:程序B发送带权限的广播
val intent = Intent("com.example.MY_CUSTOM_ACTION")
intent.putExtra("data", "Secret message")
sendBroadcast(intent, "com.example.MY_PERMISSION") // 添加权限
步骤3:程序A声明并使用权限
<!-- 程序A的 AndroidManifest.xml -->
<uses-permission android:name="com.example.MY_PERMISSION" />
<receiver
android:name=".MyReceiver"
android:permission="com.example.MY_PERMISSION"> <!-- 接收器添加权限 -->
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
</receiver>
总结口诀
“跨应用广播能实现,隐式Intent是关键,
静态注册版本限,动态注册更保险。
8.0以上要小心,权限控制保安全,
自定义权限加签名,恶意应用靠边站!”