Android O 前瞻 - 是时候和 Implict Broadcast 说再见了

Hevin

5 个月前

简评:果然省电是 Android O 的第一任务。

日前,Android O 预览版已经发布,这里就来介绍下 Android O 中对 Broadcast 的改变。

Android O 对于系统广播(Broadcast)的改变归根结底都是为了进一步的节省功耗。Google 在 Android Marshmallo (6.0, API level 23) 中引入了 Doze and App Standby 来改进 Android 系统的电池表现。

Doze 限制所有的应用程序在特殊的时间窗口中执行耗电任务,而 App Standby 会限制最少使用 App 的网络活动。同时 Google 开始建议开发者使用 JobScheduler 来安排所有的后台任务。

在 Android Nougat (7.0) 中,Google 移除了三项隐式广播(Implict Broadcast)(CONNECTIVITY_ACTION, ACTION_NEW_PICTURE, ACTION_NEW_VIDEO),而在 Android O 中除了这里列出的,其余所有的隐式广播都被移除了。

Google 认为应用程序在其 manifest 中注册了太多没必要的 BraodcastReceiver,导致了不必要的耗电。比如,很多的应用和第三方 SDK 都会监听 CONNECTIVITY_ACTION 广播当你离开家,断开了家里的 wifi。Android 发送 CONNECTIVITY_ACTION 广播,结果几乎所有的应用都会被唤醒并对此作出反应。

并且,因为 wifi 不再可用,手机会连接上移动网络,广播又会发送一遍,回到家再连上 wifi,相同的事再次发生。

鉴于开发者们肯定更多的只是考虑自己的应用,你可以想象一下手机里的每个应用可能都会去监听网络状态变更、是否拍摄了新照片、安装了新应用、开始充电等等事件。因为这些 App 都在 AndroidManifest.xml 中注册接收这些广播,所以它们总是能被唤醒接收这些广播,即使不在前台,甚至没有运行。Google 也意识到隐式广播被滥用了,因此才会在 Android O 中清除了如此多的隐式广播。

那在 Android O 中我们应该怎么做呢?

1. 确定哪些 Broadcast 是隐式(Implict)的

根据官方文档,所有没有直接和你应用相关的广播都是隐式的。比如文档中举例的 ACTION_PACKAGE_REPLACED,会在每个新应用安装时被广播。因此,像 ACTION_MY_PACKAGE_REPLACED 这样的就是显式广播(explicit Broadcast),因为其只会在你的应用更新时才会进行广播。

绝大多数我们监听的广播都是隐式的。

2. 确定你的应用是否会被影响

这里列出的是没有被移除的隐式广播,也就是如果你的应用只是监听了这些广播的话,那么恭喜你,你的应用不需要改。

3. 如果应用确实监听了这些被移除的隐式广播,JobScheduler 来解救你

JobScheduler 完美适配 Doze 和 App Standby,可以根据定义的条件来执行任务,比如:

ComponentName myService = new ComponentName(this, MyService.class);
JobInfo myJob = new JobInfo.Builder(myService).setRequiresCharging(true).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setPersisted(true).build();JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(myJob);

不过,JobSchedular 只支持 Android API 21 及以上,如果你的应用需要支持以下版本的系统,官方建议可以使用 FirebaseJobDispatcher。

这里推荐可以用 Evernote 的 Android-Job。其能够根据当前系统,当系统为 Marshmallow 及以上时使用 JobSchedular。当版本没达到时,根据是否集成了 Google Play Service 来使用 GCMNetworkManager 或 AlarmManager。

结论

不要再监听 Android 移除的隐式通知,使用 JobSchedular, FirebaseJobDispatcher 或 Android-Job 来实现相同的功能。

android 8.0 移除静态注册广播相关推荐

  1. 安卓8.0静态注册广播不能用的问题

    今天试了下静态注册广播,但是发现接收不到广播 解决方案如下: 在intent里面加   component("广播接收者的包名","广播接收者路径") 这样就能 ...

  2. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  3. Android 9.0系统源码_广播(一)广播的注册

    前言 广播作为四大组件之一,使用频率远没有Activity高,但是广播的工作过程还是十分有必要了解的.本系列文章将会逐步讲述广播的注册.发送和接受:而本篇我们要讲的就是广播的注册. 广播的注册分为两种 ...

  4. 自定义动态注册广播和静态注册广播

    一.动态注册 关键代码 class MyActivity extentds Activity{//DYNC_BROADCAST可以随意,但注册广播和发送广播时action应该保持一致private s ...

  5. 为什么 Android 8.0 注册的广播接收不到了?

    本文首发微信公众号:菜天Android 忙啊-最近好忙呀. 这篇文章偷个闲,记录下 Android8.0 上的新增的广播限制. 零.前言 最近在基于 Android 8.1 的系统项目中有用到静态注册 ...

  6. android 静态注册wifi广播,Android中BroadcastReceiver详解

    BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式.这些广播被发送当重要的事件发生的时候.例如,安卓系统发送广 ...

  7. 1-AII--BroadcastReceiver广播的静态注册与动态注册

    一.静态广播注册 MainActivity.java public class MainActivity extends AppCompatActivity {@BindView(R.id.btn_s ...

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

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

  9. Android 7.0 Nougat介绍

    Android 7.0 Nougat 1.多窗口支持 在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 - 多窗口支持. 现在,用户可以一次在屏幕上打开两个应用. ...

最新文章

  1. 跟我学雨林木风系统制作——2.涉及的技术及用到的工具介绍
  2. Order附近语法错误
  3. 单点登录Redis存储Session及SessionId问题说明与集群实战-4
  4. c++builder中dbgrid控件排序_如何实现APP中各种布局效果?学会这几个控件就够了...
  5. 场景切换时清理缓存!!CCTextureCache、CCSpriteFrameCache、CCAnimationCache
  6. Linux系统下修改主机名(CentOS7)
  7. 模式识别+Matlab 最大似然分类(MLC)【贝叶斯(Bayes)分类法】
  8. 用 DocFetcher 全文搜索
  9. java 切图 软件_Java 切图
  10. KeilC51基础 改变代码的字体大小
  11. Vue实现树形菜单组件
  12. 安装目录里无法找到计算机,Win7系统下programdata文件夹找不到怎么办?
  13. 搭建自己的技术博客系列(六)酷炫主题icarus常用配置整合版,快速搞定博客首页
  14. 段码液晶屏笔段电压范围_LCD段码(笔段)液晶显示屏和点阵液晶显示屏
  15. javascript之传智播客
  16. 硬件设备与软件交互加密方案
  17. 怎么样培养极限运动身体素质
  18. 密码学—Playfair加密算法 python实现
  19. 数据库中的内连接、自然连接和外连接的区别
  20. 网咖评分系统项目简介

热门文章

  1. crontab 半小时_?用猫粮诱惑,7名消防员花半小时救出困在夹墙间的喵星人
  2. 获取系统版本号_数据库系统原理
  3. a eraser eraser还是an_eraser前面用a还是an
  4. kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
  5. 数组传参中形参的秘密,以及数组名当作函数实际参数的特点,以及二维数组,以及外部变量和全局变量
  6. html tr中可以有br吗,html table tr td br 什么意思 缩写
  7. html隐藏目录在哪里查找,使用Dirsearch查找隐藏目录
  8. php aapt apk 包名,aapt 命令可应用于查看apk包名、主activity、版本等很多信息
  9. php中使用json做api,JSONAPI在PHP中的应用
  10. 《基于张量网络的机器学习入门》学习笔记1