热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android8.0移除静态注册广播

AndroidO前瞻-是时候和ImplictBroadcast说再见了Hevin5个月前简评:果

Android O 前瞻 - 是时候和 Implict Broadcast 说再见了
Hevin 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 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
author-avatar
执念
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有