Android 静态注册广播收不到

一、问题现象
在进行Android开发的时候,有多种方式和第三方应用进行通信,常见的有aidl、service、receiver、content provider等,这不,最近为了省事使用了广播和第三方应用进行通信,但是发现一个问题,对方偶发收不到广播,开始怀疑对方是不是动态注册了广播,和对方的开发确认是静态注册(也就是在manifest文件中注册),这种方式应该不会有什么问题的,经过多次测试发现问题的出现有个规律:注册广播的应用在首次安装从未启动的情况下是收不到广播的(如果是覆盖安装也是可以收到广播),既然找到的问题出现的场景就好查到问题的原因了。
二、问题原因
经过查询网上的资料和源码,发现在Android3.1之后,首次安装从未启动过的应用,系统会默认一个标志stoped,当系统有某个应用发送广播的时候,会进行选择性过滤(也就是那些状态为stopped的应用不会收到广播)
三、解决方法
既然查到了原因,那怎么解决呢,针对以上原因有三种方法:
1、在发送广播的时候增加一个flag(不是所有的rom都支持):
从Android 3.1开始,系统给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),用来控制Intent是否要对处于停止状态的App起作用

在注册广播的时候添加action,同时设置android:exported=“true”;

2、修改协议,不要使用广播,使用service代替就挺好
3、 发送之前先判断对方进程是否存在,不存在先拉起在发广播,此方案和方案2有重复,拉起的逻辑也够发送消息了
综上,建议如果出现这个问题,建议更改协议最保险(方案二)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值