一句话说透Android里面的程序A能否接受到程序B的广播

169 阅读2分钟

一句话总结:

可以,但有条件!程序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)及以上,禁止通过清单文件静态注册大部分隐式广播(防止滥用后台唤醒)。
  • 豁免的广播:部分系统广播(如开机完成、时区变化)仍可静态注册。

解决方案

  1. 使用动态注册:确保程序A在前台运行(如 Activity 或前台 Service)。

  2. 发送显式广播(不推荐) :指定目标应用的包名或组件名(需知道程序A的详细信息)。

    // 程序B发送显式广播  
    val intent = Intent("com.example.MY_CUSTOM_ACTION")  
    intent.setPackage("com.example.appA") // 指定程序A的包名  
    sendBroadcast(intent)  
    
  3. 使用权限控制:定义自定义权限,确保只有授权应用能收发广播。


增强安全性:自定义权限

步骤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以上要小心,权限控制保安全,
自定义权限加签名,恶意应用靠边站!”