Android 为什么监听不到开机广播action.BOOT_COMPLETED

Android手机开机后,会发送android.intent.action.BOOT_COMPLETED广播,监听这个广播就能监听开机。

一般的步奏如下:

注册广播

<receiver android:name="com.netmoon.broadcast.BootBroadCastReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" >
        </action>
    </intent-filter>
</receiver>

添加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

实现Receiver


public class BootRroadCastReceiver extends BroadcastReceiver {
    private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_BOOT.equals(intent.getAction()))
            Toast.makeText(context, R.string.bootup_receiver, Toast.LENGTH_SHORT).show();
    }
}

但是Android API Level8以上的时候,程序可以安装在SD卡上。如果程序安装在SD卡上,那么在BOOT_COMPLETED广播发送之后,SD卡才会挂载,因此程序无法监听到该广播。

解决办法:同时监听开机和sd卡挂载。(也不能只监听挂载就认为开机了,因为有的手机没有sd卡)

实现对挂载进行监听meda mounted如下:

<receiver android:name=".Ge" >
    <intent-filter >
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
        <data android:scheme="file" >
        </data>
    </intent-filter>
</receiver>

监听meda mounted的Receiver就不写了。

如何实现一个能同时监听开机BOOT_COMPLETED和挂载meda mounted的广播接收器呢?

理论上只要将meda mounted的intent-filter和BOOT_COMPLETED的intent-filter放在一起就行了,但是,放同一个intent-filter里,boot complete监听不到,需要放到两个intent filter中:

<receiver android:name=".Ge" >        
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
    <intent-filter >
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
        <data android:scheme="file" >
        </data>
    </intent-filter>
</receiver>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你的程序无法接收到 `android.intent.action.BOOT_COMPLETED` 事件,可能是以下原因之一: 1. 你没有在 AndroidManifest.xml 文件中声明 `BOOT_COMPLETED` 权限,需要在 `<uses-permission>` 标签中添加以下代码: ``` <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> ``` 2. 你没有注册 `BOOT_COMPLETED` 的广播接收器,需要在 AndroidManifest.xml 文件中添加以下代码: ``` <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` 注意,你需要自己定义一个 BootReceiver 类,并在其中处理接收到 BOOT_COMPLETED 事件的逻辑。 3. 如果你是在 Android 8.0 及以上版本中测试,需要在代码中动态请求 `RECEIVE_BOOT_COMPLETED` 权限,可以使用以下代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Create a new job and schedule it JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); ComponentName componentName = new ComponentName(context, BootJobService.class); JobInfo jobInfo = new JobInfo.Builder(1, componentName) .setMinimumLatency(1000) .build(); jobScheduler.schedule(jobInfo); } ``` 注意,你需要自己定义一个 BootJobService 类,并在其中处理接收到 BOOT_COMPLETED 事件的逻辑。同时,在 AndroidManifest.xml 文件中添加以下代码: ``` <service android:name=".BootJobService" android:permission="android.permission.BIND_JOB_SERVICE" /> ``` 希望能帮到你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值