Android8.0 静态receiver接收不到隐式广播 Background execution not allowed: receiving Intent
Android8.0的新特性值得注意一下,不然会出现很多莫名的问题。。。
后台执行限制
Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。
此外,为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:
现在,在后台运行的应用对后台服务的访问受到限制。
应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。
默认情况下,这些限制仅适用于针对 O 的应用。不过,用户可以从 Settings 屏幕为任意应用启用这些限制,即使应用并不是以 O 为目标平台。
Android 8.0 还对特定函数做出了以下变更:
如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
以下这个就是Android8.0的后台限制新特性导致的,果然要踩过坑,才印象深刻。
自己编写了一个demo跟踪广播的发送流程。
demo:注册一个静态receiver,然后发送广播。
Activity中发送广播的代码:
public class MainActivity extends Activity {public static final String TAG = "TEST";public final String TEST_ACTION = "com.maureen.test.TEST_ACTION";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"onResume");Log.d(TAG,">>sendBroadcast");Intent intent = new Intent(TEST_ACTION);sendBroadcast(intent);Log.d(TAG,"<<sendBroadcast");}private BroadcastReceiver mTestReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();Log.d(TAG,"Dynamic receiver:action="+action);}};}
AndroidManifest.xml中注册静态receiver:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.atc6111.testswitchicon"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name=".MyTestReceiver"><intent-filter><action android:name="com.maureen.test.TEST_ACTION"/></intent-filter></receiver></application></manifest>
Receiver对应的java文件:
public class MyTestReceiver extends BroadcastReceiver {private final String TAG = "TEST-MyTestReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG,"Static receiver:action=" + intent.getAction());}
}
好的,现在开始运行这个demo。结果这个receiver一直都没有收到广播。。。。。
查看log,发现了warning信息:
W BroadcastQueue: Background execution not allowed: receiving Intent { act=com.maureen.test.TEST_ACTION flg=0x10 } to com.example.atc6111.testswitchicon/.MyTestReceiver
“Background execution not allowed” 打印出该warning的代码:
即是以下两种情况静态receiver不会接收到广播:
发送的intent设置了FLAG --FLAG_RECEIVER_EXCLUDE_BACKGROUND;
以下情况的均满足时:
①intent没有指定接收组件,也就是没有setComponent
②intent没有执行接收的package,也就是没有setPackage③发送的intent没有设置FLAG-FLAG_RECEIVER_INCLUDE_BACKGROUND④给定的权限并不都是签名权限。
根据这两种情况,即是说静态receiver接收不了隐式广播。本来打算采用最简单的方法添加Flag来解决的。
但是奇怪的是,Android Studio里没有FLAG_RECEIVER_INCLUDE_BACKGROUND!!!!
然后,只好在发送intent的时候setPackage。
@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"onResume");Log.d(TAG,">>sendBroadcast");Intent intent = new Intent(TEST_ACTION);intent.setPackage(getPackageName());sendBroadcast(intent);Log.d(TAG,"<<sendBroadcast");}
修改之后,静态Receiver就能收到广播了。
但是如果就是想让静态receiver接收到隐式广播呢?应该还有其他方法,待学。。。。
Android8.0 静态receiver接收不到隐式广播 Background execution not allowed: receiving Intent相关推荐
- Android8.0恢复出厂设置失败-BroadcastQueue: Background execution not allowed
Android7.0恢复出厂设置调用下面的代码可正常恢复出厂 Intent intent = new Intent(Intent. ACTION_MASTER_CLEAR);intent.addFla ...
- android8显示广播,关于android8.0静态接收广播
android8.0很多广播不能静态注册接受 查看log显示 Background execution not allowed: receiving 查看代码frameworks/base/servi ...
- Android 7.0 隐式广播-监听网络变化
Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceive ...
- 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
项目涉及到多个数据库的查询更新操作,也就必然需要分布式事务的支持,查了MSDN知道 .net 2.0 中利用新增的 System.Transactions 命名空间可以简单的实现分布式事务: Syst ...
- android 静态广播无效,Android8.0静态广播接收静态注册无效,并实现全局网络监听...
解决方案: 在APP的Activity中对广播接收进行动态注册即可完成. public class NetWorkStateReceiver extends BroadcastReceiver { @ ...
- Android8.0后静态广播以及有序广播的使用
Android8.0后静态广播以及有序广播的使用 我们都知道,8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出的改变,Android8.0后正常静态注册的广播都没有用了,现 ...
- Android 8.0 学习(14)---Android8.0适配分析
公司项目Android8.0适配分析 1. 官方推荐的兼容测试方式 2. Android8.0行为变更说明 Android 8.0 行为变更包括两个部分:针对所有 API 级别的应用和针对 And ...
- Broadcasts在Android7.0以及Android8.0中的变更
从Android6.0开始,谷歌更新的Android越来越注重应用安全.对一些行为进行了限制,相信大家都有关注这些新版的变更. 本文主要记录我在学习Broadcasts在Android7.0以及And ...
- Android8.0适配那点事(二)
小伙伴们,咱们今天咱继续对Android8.0的适配进行分解,今天将针对启动页,版本适配和系统限制等进行"啃食" 1.启动页适配 近日,我无意中发现应用在8.0系统上面启动页崩溃, ...
最新文章
- 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
- 【LeetCode】55.跳跃游戏
- JAVA高并发的三种实现
- 同步设备IO与异步设备IO
- SpringBoot2 参数管理实践,入参出参与校验
- SEM竞价员怎么分析竞争对手,需要分析哪些?
- C语言——输出*菱形
- [Editor][003][Emacs] 从零到高级的进阶 - 实践开发 - emacs tutorial的使用和基本导航键
- .Net将Base64字符串转换为Image对象或保存为图片到本地
- Nginx常见面试题整理---40题
- 云服务器快照——是“后悔药”也是“任意门”
- 连续分配存储管理,覆盖交换和存储碎片
- 怎么离线发布全国谷歌高清卫星影像地图瓦片
- Axis2用法(1)JAVA2WSDL和WSDL2JAVA
- 面向对象_猫狗案例加入跳高功能代码实现
- Simscape/Simulink 电力仿真降压电路 Buck Converter
- 一个获取电脑显示器序列号的VBS脚本
- 台湾内存厂商进军NAND市场未果,时机已过仅当利基玩家?
- 基于C#实现的进制计算器
- Python也可以抢网速,我下了十部电影,室友才一部
热门文章
- Swagger文档详解
- Power BI——树状图(矩形树图)
- “火柴棒等式”【题解】
- 【PS】2G复古花卉植物素材包
- win10照片查看器_电子相册怎么制作 利用照片生成电子相册方法
- 结构体在内存中的存储方式
- 【数据结构和算法设计】算法篇(11) 概率算法和近似算法
- 牛客-https://www.nowcoder.com/acm/contest/96/H
- 大学python考试试题_大学Python程序题题库
- 大学生怎么高效的免费搜题?怎么获取题库API接口快速开发自己的搜题产品?