上面所说即:若App的TargetSDK达到了26, 我们正常静态注册的广播就没有用了。能用的仅有以下豁免的Broadcast, 包括我们自己正常发广播,如果不指定包名, 静态注册的也是收不到的。PS:动态注册是没有影响的

在我们收不到广播的时候,系统会有如下打印,即这个后台的广播接收器不会被执行

04-21 04:12:27.513 2431 4821 W BroadcastQueue: Background execution not allowed:******************

如何应对这一限制

知道了上面的限制后,我们正常的应对方式为

能动态注册,就不静态注册

如果一定要静态注册, 发送的时候指定包名,即发送显式广播

如果要接收系统广播,而对应的广播在Android8.0中无法被接收,那么只能暂时把App的targetSdkVersion改为25或以下,但这招已经不顶用了,工信部要求targetSDK必须26以上

如果我们不想发显式广播(因为我们不知道有谁要收广播),对方又不能动态注册,只能静态注册(许多应用希望是被动唤醒),我们应该怎么办呢?

我们看上面的异常:

04-21 04:12:27.513 2431 4821 W BroadcastQueue: Background execution not allowed:******************

这行log是哪边打印的呢?

我们去搜索一下:http://androidxref.com/

代码里面有个skip变量是用来标志是否跳过的,很显然1275行打印出来了,skip为true了那就, 我们不希望这个判断能够进去。

那么如合让判断不进去呢?看下面代码。

1267 } else if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)

1268 || (r.intent.getComponent() == null

1269 && r.intent.getPackage() == null

1270 && ((r.intent.getFlags()

1271 & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0)

1272 && !isSignaturePerm(r.requiredPermissions))) {

1273 mService.addBackgroundCheckViolationLocked(r.intent.getAction(),

1274 component.getPackageName());

1275 Slog.w(TAG, "Background execution not allowed: receiving "

1276 + r.intent + " to "

1277 + component.flattenToShortString());

1278 skip = true;

1279 }

有这么个判断r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND intent中携带了EXCLUDE_BACKGROUND标志位肯定进去,很显然我们正常都不带,只有希望后台收不到的时候才会带。

r.intent.getComponent() == null, 这个肯定不会为null的。为null是必须跳过

r.intent.getPackage() == null, 若包名为空,那肯定也跳过

r.intent.getFlags() & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0 不能带有FLAG_RECEIVER_INCLUDE_BACKGROUND这个标志位,若带了,那就进不去了,这不就是我们希望的结果么。

那么方案有了,携带 FLAG_RECEIVER_INCLUDE_BACKGROUND 这个标志位。我们发现在AS中使用Intent是找不到这个标志位的,应该是hide了,没有被编译进SDK。

看一下,果然,那么我们直接带硬编码即可。

/**

* If set, the broadcast will always go to manifest receivers in background (cached

* or not running) apps, regardless of whether that would be done by default. By

* default they will only receive broadcasts if the broadcast has specified an

* explicit component or package name.

*

* NOTE: dumpstate uses this flag numerically, so when its value is changed

* the broadcast code there must also be changed to match.

*

* @hide

*/

public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;

因此得出结论:发送广播的时候携带intent.addFlags(0x01000000); 即能让广播突破隐式广播限制。

谢谢大家的阅读。

android隐式广播和显式广播是什么,在Android8.0上突破隐式广播的限制相关推荐

  1. Android护眼模式、屏幕亮度调节功能开发【基于Android8.0】

    Android护眼模式.屏幕亮度调节功能开发[基于Android8.0] [引言]网上关于写护眼模式,屏幕亮度调节的android的方法很少,找到的都不能很好的适配Android8.0的版本.于是自己 ...

  2. Android 8.0 linux内核,在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序---Android8.0版本实现-对照老罗版本...

    老罗版本参见:https://blog.csdn.net/luoshengyang/article/details/6573809 在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简 ...

  3. 【android】Notification 和 Service的结合应用以及Notification在Android8.0之后的坑 Bad notification

    在结合<第一行代码>复习Service时踩到一个坑--notification 弹不出来,然后就crush掉了!!! 查阅相关资料发现是在Android8之后,notification很多 ...

  4. Android 8.0 学习(14)---Android8.0适配分析

    公司项目Android8.0适配分析 1. 官方推荐的兼容测试方式  2. Android8.0行为变更说明  Android 8.0 行为变更包括两个部分:针对所有 API 级别的应用和针对 And ...

  5. Android 8.0 学习(24)---Android8.0 WiFi热点适配

    Android8.0 WiFi热点适配 在Android8.0上用以前的方式调试WiFi热点的时候发现无法正常开启热点,于是查了下,发现之前的热点打开接口已经废弃.原先的接口WifiManager.j ...

  6. Android8.0 静态receiver接收不到隐式广播 Background execution not allowed: receiving Intent

    Android8.0的新特性值得注意一下,不然会出现很多莫名的问题... 后台执行限制 Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系 ...

  7. Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  8. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  9. Neo4j:使隐式关系成为显式和双向关系

    最近,我阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示了Neo Technol ...

  10. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

最新文章

  1. javascript终极屏蔽右键/禁止复制/禁止另存/禁止右键/禁止选取/禁止粘贴的方法...
  2. 利用Eclipse连接JDBC-(SQL Server2008)
  3. linux服务器防cc攻击工具,宝塔linux面板
  4. 多线程内存泄漏_内存泄漏的场景和解决办法
  5. linux的mysql本地yum安装_linux下使用yum安装mysql
  6. 程序员什么时候该考虑换工作
  7. linux自带mysql启动不_Linux系统自带的MySQL 数据库启动问题
  8. Django+nginx+uwsgi+ubuntu18.04网站部署
  9. 【leetcode】动态规划优秀题目
  10. 怎样在IIS下配置PHP
  11. 何宾 单片机原理及应用_STC单片机原理及应用何宾答案
  12. python局域网传输文件
  13. Ubuntu 朗文不发音问题
  14. 以太网帧的目的地址从哪里来?
  15. 网络准入控制学习——Chap1
  16. 云服务器系统分区,云服务器系统盘可以分区
  17. 楼道灯人体红外感应电路(全波式)
  18. web项目的启动时文件加载顺序
  19. 纯C语言INI文件解析
  20. BZOJ 4811([Ynoi2017]由乃的OJ-树链剖分)

热门文章

  1. 用梯度下降求解最小二乘线性回归python实现
  2. pythonclass使用教程_【Python 1-15】Python手把手教程之——详解类Class以及类的使用...
  3. C#网络编程----(三)委托和多线程
  4. python学习(四)----函数
  5. linux usb拔出防止抖动,Linux 下监控USB设备拔插事件
  6. 如何在跑cts的时候生成log_晚上跑高速如何超大货车,教你几条经验,关键时候能保命...
  7. binlog日志_mysql日志redo log、undo log、binlog以及作用看这篇就可以啦
  8. nohup java -jar
  9. jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别
  10. 微信小程序审核不通过的解决方法