解决高版本的android8.0系统 接收不到广播的问题

本文探讨了Android 8.0系统中广播接收的问题,详细介绍了当应用程序从Android 6.0升级到Android 8.0时遇到的广播接收失败现象,并提供了两种解决方案:使用动态广播或为静态广播添加Component参数。

 

20180507 21:03:14

阅读数:431

最近在回看第一行代码时,做书上有关广播的例子时,发现高版本的android系统,对于广播的接收变得越来越严格,

导致自己写的demo中收不到广播,看了官网上的一些介绍    附上链接

https://developer.android.google.cn/about/versions/oreo/features/background-broadcasts

原来在Android6,将该应用安装到Android7系统上面可正常使用,但是安装到Android8上面广播的接收不到广播

1. 问题的前提:本人维护的一个应用是通过按键发送一个自定义广播,然后拉起服务。原来项目开发是在Android6,将该应用安装到Android7系统上面可正常使用,但是安装到Android8上面,死活收不到广播。通过百度参考了两篇文章(文章最后加备注),做了以下总结:

2.原因:Android8在静态广播的使用上做了一些限制具体可查看:https://developer.android.google.cn/about/versions/oreo/android-8.0.html

3. 解决办法:

1)使用动态广播代替静态广播,具体可参考博客1

2)保留原来的静态广播,但是加入Component参数,具体可参考博客2

 

具体的解决办法就是

Intent intent =new Intent( "com.example.wenhaibo.androidstudy_broadcast02.MY_BROADCAST" );

intent.setComponent( new ComponentName( "com.example.wenhaibo.androidstudy_broadcast02" ,

        "com.example.wenhaibo.androidstudy_broadcast02.MyBroadCastReceiver") );

sendBroadcast( intent );

sendBroadcastintent)方法之前,用intent 对象调用一下  setComponent new ComponentName''参数一'',''参数二''))  参数一是你的包名,参数二是你的接收器的路径。

 

<think>好的,我现在要解决Android内置应用无法接收开机广播问题。首先,我需要回忆一下相关的知识,并结合用户提供的引用内容来分析可能的原因和解决方案。 根据引用[1],高版本Android系统中,应用必须至少运行一次才能接收系统广播,比如开机广播。如果应用进程被杀死,可能就收不到广播。这可能是一个关键点。内置应用可能没有满足这个条件,或者权限配置有问题。 接下来,用户提到的是内置应用,通常这类应用会有系统权限。但可能需要检查是否在AndroidManifest.xml中正确声明了接收开机广播的权限和接收器。比如,需要添加RECEIVE_BOOT_COMPLETED权限,并且静态注册BroadcastReceiver。 引用[4]中的代码示例展示了如何创建一个广播接收器,并在onReceive方法中处理接收到的广播。这可能涉及正确配置intent-filter,确保接收的是正确的ACTION_BOOT_COMPLETED动作。 另外,引用[3]提到跨进程的广播接收,但这里是系统广播,可能不需要跨应用,但需要确保接收器的正确性。同时,可能需要考虑系统版本差异,比如Android 8.0及以上对隐式广播的限制,但开机广播是显式的,可能不受影响。 可能的步骤包括: 1. 检查权限声明:是否在清单文件中声明了RECEIVE_BOOT_COMPLETED权限。 2. 静态注册接收器:是否正确注册了接收器,并指定了BOOT_COMPLETED的action。 3. 应用安装位置:某些系统可能要求应用安装在内部存储才能接收开机广播。 4. 系统签名:内置应用可能需要使用平台签名,否则权限不足。 5. 测试环境:是否在真机上测试,模拟器可能存在问题,或者系统版本导致限制。 还需要考虑是否有其他因素,比如应用是否被系统优化掉,或者在启动时被延迟。此外,高版本Android可能对后台启动服务有限制,需要改用JobScheduler等替代方案。 用户的问题可能涉及这些方面,需要逐一排查。例如,确认权限是否正确添加,接收器是否正确配置,应用是否有系统签名,以及是否满足系统版本的要求。</think>针对Android内置应用无法接收开机广播问题,以下是分步解决方案: ### 一、权限配置检查 1.AndroidManifest.xml中添加权限声明: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> ``` 2. 对于系统应用,需要声明特权权限(仅限系统分区应用): ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" android:protectionLevel="signature"/> ``` ### 二、接收器静态注册 ```xml <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <!-- 部分厂商定制系统 --> </intent-filter> </receiver> ``` ### 三、系统签名要求 1. 内置应用必须使用平台签名: ```bash # 使用Android源码编译环境签名 LOCAL_CERTIFICATE := platform ``` 2.Android.mk或Android.bp中配置系统级权限 ### 四、代码实现规范 ```java public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // 必须启动Service/Activity,不能直接执行耗时操作 Intent service = new Intent(context, BootService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(service); } else { context.startService(service); } } } } ``` ### 五、特殊版本适配 | Android版本 | 注意事项 | |------------|----------| | ≥ 8.0 (API26) | 必须使用前台服务启动后台操作 | | ≥ 10 (API29) | 要求应用可见性,需添加QUERY_ALL_PACKAGES权限[^3] | | 定制ROM | 需添加厂商特定广播如`huawei.intent.action.STARTUP_READY` | ### 六、调试技巧 1. 通过adb发送模拟广播: ```bash adb shell am broadcast -a android.intent.action.BOOT_COMPLETED ``` 2. 检查系统日志: ```bash adb logcat | grep 'BOOT_COMPLETED' ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值