美文网首页
Android 静态注册广播收不到问题

Android 静态注册广播收不到问题

作者: 皮卡丘_5833 | 来源:发表于2019-10-15 16:54 被阅读0次

    一、问题现象

    在进行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有重复,拉起的逻辑也够发送消息了

    综上,建议如果出现这个问题,建议更改协议最保险(方案二)

    相关文章

      网友评论

          本文标题:Android 静态注册广播收不到问题

          本文链接:https://www.haomeiwen.com/subject/hxwsmctx.html