一、问题现象
在进行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";