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相关推荐

  1. Android8.0恢复出厂设置失败-BroadcastQueue: Background execution not allowed

    Android7.0恢复出厂设置调用下面的代码可正常恢复出厂 Intent intent = new Intent(Intent. ACTION_MASTER_CLEAR);intent.addFla ...

  2. android8显示广播,关于android8.0静态接收广播

    android8.0很多广播不能静态注册接受 查看log显示 Background execution not allowed: receiving 查看代码frameworks/base/servi ...

  3. Android 7.0 隐式广播-监听网络变化

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceive ...

  4. 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)

    项目涉及到多个数据库的查询更新操作,也就必然需要分布式事务的支持,查了MSDN知道 .net 2.0 中利用新增的 System.Transactions 命名空间可以简单的实现分布式事务: Syst ...

  5. android 静态广播无效,Android8.0静态广播接收静态注册无效,并实现全局网络监听...

    解决方案: 在APP的Activity中对广播接收进行动态注册即可完成. public class NetWorkStateReceiver extends BroadcastReceiver { @ ...

  6. Android8.0后静态广播以及有序广播的使用

    Android8.0后静态广播以及有序广播的使用 我们都知道,8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出的改变,Android8.0后正常静态注册的广播都没有用了,现 ...

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

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

  8. Broadcasts在Android7.0以及Android8.0中的变更

    从Android6.0开始,谷歌更新的Android越来越注重应用安全.对一些行为进行了限制,相信大家都有关注这些新版的变更. 本文主要记录我在学习Broadcasts在Android7.0以及And ...

  9. Android8.0适配那点事(二)

    小伙伴们,咱们今天咱继续对Android8.0的适配进行分解,今天将针对启动页,版本适配和系统限制等进行"啃食" 1.启动页适配 近日,我无意中发现应用在8.0系统上面启动页崩溃, ...

最新文章

  1. 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
  2. 【LeetCode】55.跳跃游戏
  3. JAVA高并发的三种实现
  4. 同步设备IO与异步设备IO
  5. SpringBoot2 参数管理实践,入参出参与校验
  6. SEM竞价员怎么分析竞争对手,需要分析哪些?
  7. C语言——输出*菱形
  8. [Editor][003][Emacs] 从零到高级的进阶 - 实践开发 - emacs tutorial的使用和基本导航键
  9. .Net将Base64字符串转换为Image对象或保存为图片到本地
  10. Nginx常见面试题整理---40题
  11. 云服务器快照——是“后悔药”也是“任意门”
  12. 连续分配存储管理,覆盖交换和存储碎片
  13. 怎么离线发布全国谷歌高清卫星影像地图瓦片
  14. Axis2用法(1)JAVA2WSDL和WSDL2JAVA
  15. 面向对象_猫狗案例加入跳高功能代码实现
  16. Simscape/Simulink 电力仿真降压电路 Buck Converter
  17. 一个获取电脑显示器序列号的VBS脚本
  18. 台湾内存厂商进军NAND市场未果,时机已过仅当利基玩家?
  19. 基于C#实现的进制计算器
  20. Python也可以抢网速,我下了十部电影,室友才一部

热门文章

  1. Swagger文档详解
  2. Power BI——树状图(矩形树图)
  3. “火柴棒等式”【题解】
  4. 【PS】2G复古花卉植物素材包
  5. win10照片查看器_电子相册怎么制作 利用照片生成电子相册方法
  6. 结构体在内存中的存储方式
  7. 【数据结构和算法设计】算法篇(11) 概率算法和近似算法
  8. 牛客-https://www.nowcoder.com/acm/contest/96/H
  9. 大学python考试试题_大学Python程序题题库
  10. 大学生怎么高效的免费搜题?怎么获取题库API接口快速开发自己的搜题产品?