广播组件学习中——无法接收开机广播
为了使程序在未启动的情况下就能接收到广播。动态注册的广播接收器无法实现这一功能(因为注册的逻辑是写在onCreate()方法中的),所以这里用静态注册实现开机启动。
当程序接收到一条开机广播,当收到这条广播时就可以在onReceive()方法中执行相应的逻辑,从而实现开机启动的功能。
静态的广播接收器一定要在AndroidManifest.xml文件中注册才可以使用。
而由于Android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,在标签里要添加相应的action。监听系统开机广播也需要声明权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> //权限声明
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/> //添加相应的action
</intent-filter>
可是经过运行和重启后发现开机没有接收到广播
因为在Android studio3.4.1的程序是安装在sd卡上的,在android.intent.action.BOOT_COMPLETED的广播发送之后,sd卡才被挂载,所以广播接收器接收不到该广播。
解决办法:同时监听开机和sd卡挂载。(也不能只监听挂载就认为开机了,因为有的手机没有sd卡)
如下:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter> //监听开机
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter > //监听sd卡挂载
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file">
</data>
</intent-filter>
</receiver>
有的时候加上
<uses-permission android:name="android.permission.RESTART_PACKAGES" /> //权限声明(大多数的时候都不要就可以接收到广播了,我尝试时的这段代码上就有一条横线,去掉没有问题)