刚开机接收不到广播的一种情况

问题:android设备刚开机的一断时间内接收不到广播

 

需求:底层同事将设备的语音唤醒用广播的形式发出来,我只要接受广播,弹出语音对话就好。

 

需求很简单,接受广播

先自定义个BroadcastReceiver 做接受到广播之后的处理(此处省略MyVoiceCompleteReceiver实现)

我们都知道广播接收器有两种注册方式,

1、静态注册

 <receiver android:name=".myBroadcastReceiver.MyVoiceCompleteReceiver"
     >
     <intent-filter >
         <action android:name="android.intent.action.USER_XXXXXX_UART" />
       
     </intent-filter>
 </receiver>

2、动态注册

myUartBroadcastReceiver = new MyVoiceCompleteReceiver();
IntentFilter intentFilteralert2 = new IntentFilter("android.intent.action.USER_XXXXXX_UART");
this.registerReceiver(myUartBroadcastReceiver, intentFilteralert2);

然后考虑用那种方式好呢,两种注册方式的区别

动态注册广播跟随程序的生命周期。静态注册广播是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

当时我考虑我的需求是语音唤醒当然是从开机之后一直都可以用,当然是常驻型就好了,所以也没多考虑就用了静态注册的方式。

可是问题就来了,机器在开机后开始的几秒死活接受不到广播,过了好久,突然前面发的广播,一次都接受到了。

知道bug的我整个人都不好了。

反复测试后,发现更奇葩的是wifi网络下,有无网络连接开机均可正常接受。

有线eth0下,有网络也可以正常接受到广播,唯独有线无网络时不能正常接受,过一断时间后,积攒的广播就一起传出来了。

 

开始我以为是我静态广播接收器刚开机的时候没有注册上,所以我修改了一下

<receiver android:name=".myBroadcastReceiver.MyVoiceCompleteReceiver"
            >
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.USER_XXXXXX_UART" />
                <action android:name="android.media.AUDIO_BECOMING_NOISY" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

很有意思,

几次测试后,wifi网络下,有无网络连接开机均可正常接受。

有线eth0下,有网络也可以正常接受到广播。

有线无网络时不能正常接受,AUDIO_BECOMING_NOISY广播一开机就立马能接受,而BOOT_COMPLETED开机广播和我们自定义的USER_XXXXXX_UART广播竟然过了一会才能接受到。

 

而当我将广播接受换成动态注册后,竟然马上就能接受到了。

 

有人说:

但是我很不解的是android.media.AUDIO_BECOMING_NOISY为什么不受影响呢,不过可以猜测的是AMS开机时网络连接状态也是其中的一个步骤,开机广播的发出也会有延迟。这也可能是之前想要实现开机启动app时,无法立马接受到开机广播的原因。

 

 

 

附:android 8.0以上版本建议全部都用静态注册广播

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值