Android 9中自定义Broadcast Receiver跨应用通信使用方案咨询
Android 9 自定义跨应用BroadcastReceiver适配方案
Android 9(API 28)并没有完全禁用自定义BroadcastReceiver,只是针对静态注册的隐式全局广播加了投递限制,你不需要推翻已有的自定义广播结构,按下面的方案适配即可正常使用:
- 方案1:最小成本适配,发送广播时指定接收方包名
你之前收不到广播,基本是因为发送时用了只设置Action的隐式广播写法,只要在发送Intent时调用setPackage()明确指定接收方应用的包名,就会被系统判定为显式广播,不受Android 9的静态广播限制,原有Receiver端的代码完全不需要修改。
适配前后的代码对比如下:
如果需要做访问控制,你可以配套加签名级自定义权限,发送和接收广播时都校验权限,和原有逻辑的安全性完全一致。// 旧写法:隐式广播,Android9上静态注册的Receiver无法接收 Intent crossAppIntent = new Intent("com.your.defined.CUSTOM_ACTION"); crossAppIntent.putExtra("payload", "需要传递的业务数据"); sendBroadcast(crossAppIntent); // 适配写法:指定接收方包名,全版本正常生效 Intent crossAppIntent = new Intent("com.your.defined.CUSTOM_ACTION"); // 填入接收广播的目标应用包名,多接收方场景循环给每个包名发送即可 crossAppIntent.setPackage("com.target.app.packagename"); crossAppIntent.putExtra("payload", "需要传递的业务数据"); sendBroadcast(crossAppIntent); - 方案2:改用动态注册广播接收器
如果你不方便修改发送端逻辑,可以把原来在AndroidManifest.xml中静态注册的自定义Receiver,改为在应用启动时(比如Application.onCreate生命周期)动态注册,动态注册的接收器不受隐式广播投递限制,可以正常收到全局隐式广播。
注意这个方案的局限:应用进程被杀死后,动态注册的Receiver会失效,如果你需要应用未启动时也能接收广播触发逻辑,不要选这个方案;另外动态注册必须在对应生命周期结束时调用unregisterReceiver()反注册,否则会触发内存泄漏。 - 补充说明
不要踩误区:Android 9 弃用的是无明确接收目标的全局隐式静态广播,本质是为了减少后台应用被随意唤醒带来的耗电问题,明确指定接收目标的广播、动态注册的广播,自定义BroadcastReceiver的所有原有能力都可以正常使用,不需要完全重构为其他跨进程通信方案。
内容的提问来源于stack exchange,提问作者piruzi
相关产品推荐
相关产品推荐

