问题: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以上版本建议全部都用静态注册广播