当前位置: 首页 > article >正文

Android限制后台服务、广播和Activity,节省更多的电量

概述:

    Android 系统支持多个应用和服务同时运行。例如,用户可以在一个窗口中玩游戏,同时在另一个窗口中浏览网页,并使用第三个应用播放音乐。然而,同时运行的应用越多,对系统造成的负担越大。如果还有应用或服务在后台运行,这会对系统造成更大负担,进而可能导致用户体验下降;例如,音乐应用可能会突然关闭。为了降低发生这些问题的几率,Android 系统在用户不与应用直接交互时施加了限制。这些限制主要体现在3个方面:后台服务、广播和Activity限制。

图片

 1. 后台服务的限制   

1.1 前台应用无限制:

    如果应用在前台(用户正在使用),可以自由创建和运行前台服务和后台服务,系统不会干预。   

1.2 后台应用有时间限制:

    应用进入后台时,在一个持续 10 分钟的时间窗内,仍可以创建和使用服务。时间窗结束后,应用将被视为处于空闲状态,系统将停止其后台服务。   

1.3 临时白名单:

    如果应用在后台处理对用户很重要的事情(如收到高优先级消息或处理短信、通知等),系统会将其加入临时白名单,再给予 10 分钟的时间运行服务。白名单时间一到,系统仍会限制应用。   

1.4 前台服务的特殊要求:

    如果应用在后台启动服务,必须使用 `Context.startForegroundService()`,并在 5 秒内显示一个用户可见的通知。否则,系统会直接停掉服务,并可能将应用标记为“无响应”(ANR)。

2. 广播的限制   

2.1 背景:

    如果应用静态注册接收广播,每次发送广播时,接收器都会消耗资源。多个应用注册接收基于系统事件的广播会引发问题,导致所有应用快速连续消耗资源,降低用户体验。从 Android 7.0 开始,删除了三项隐式广播以优化内存使用和电量消耗:网络变化广播(`CONNECTIVITY_CHANGE`)、拍照广播(`ACTION_NEW_PICTURE`)和录视频广播(`ACTION_NEW_VIDEO`)。   

2.2 静态注册受限:

    在 Android 8.0 及之后版本,静态广播接收器无法监听隐式广播。应用无法在清单中为隐式广播注册广播接收器。隐式广播是不专门针对某个应用的广播,例如 `ACTION_PACKAGE_REPLACED`,它发送到所有注册的侦听器,通知设备上的某些软件包已被替换。   

2.3 动态注册仍可用:

    应用可以在运行时使用 `Context.registerReceiver()` 为任意广播(隐式或显式)注册接收器(动态接收器)。需要签名权限的广播不受此限制,因为这些广播只会发送到使用相同证书签名的应用。许多情况下,之前注册隐式广播的应用可以使用 `JobScheduler` 获得类似功能。例如,社交照片应用可以在设备充电时执行数据清理,但不能再使用 `ACTION_POWER_CONNECTED` 静态接收器。 

3.后台 Activity 启动的限制

3.1 背景:

    从 Android Q 开始,系统对应用在后台启动 Activity 的行为进行了限制。具体来说,应用在以下情况下才能启动 Activity:

应用具有可见窗口:例如,应用在前台运行。

    前台应用发送 PendingIntent:例如,前台应用通过 PendingIntent 启动另一个应用的 Activity。

    系统发送 PendingIntent:例如,用户点击通知后,系统通过 PendingIntent 启动 Activity。

    系统发送特定广播:例如,SECRET_CODE_ACTION 等特定广播可以触发 Activity 启动

    注意:前台服务(Foreground Service)不会将应用视为在前台运行,因此无法绕过此限制。

3.2 应对策略

    为了应对后台 Activity 启动的限制,开发者应优先使用通知来向用户传递信息,而不是直接启动 Activity。以下是具体的应对策略:对于正在进行的事件(如来电),应将通知与前台服务关联,以确保通知持续显示。

4. 推荐的做法   

4.1 使用 `JobScheduler` 代替后台服务:

    Android 8.0 推荐使用 `JobScheduler` 管理后台任务。它可以根据设备电量、网络状态等条件智能调度任务,既省电又高效。   

4.2 前台服务 + 通知:

    如果任务需要长时间运行,可以使用前台服务,但必须显示用户可见的通知,否则系统会直接停掉服务。  

4.3 动态注册广播:

    避免在清单文件中静态注册隐式广播,改用动态注册,既灵活又不会被系统限制。 

5. 为什么要限制?   

5.1 省电:

    后台服务、Activity和隐式广播会消耗电量,限制它们可以延长电池续航。 

5.2 提升性能:

    太多应用在后台运行服务会拖慢系统,限制后台任务可以让设备更流畅。   

5.3 改善用户体验:

    避免后台应用占用资源导致前台应用(如音乐播放器)被意外关闭。 

6. 总结 

    Android 8.0 及之后版本对后台服务、Activity和隐式广播的限制越来越严格,主要是为了优化系统性能和电池续航。作为开发者,需要适应这些变化:优先使用 `JobScheduler` 而非后台服务;前台服务必须显示通知;隐式广播尽量使用动态注册。


http://www.kler.cn/a/568255.html

相关文章:

  • MAC 怎么设置 Java虚拟内存设置
  • vue+wsplayer对接大华的rtsp实时预览视频流
  • LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法
  • ORM Bee V2.5.2.x 发布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片
  • 六十天前端强化训练之第五天响应式设计原理深度解析
  • 0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点
  • java数据结构_Map和Set_9.1
  • 【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)
  • CES Asia 2025前瞻:网络安全与数据隐私成焦点
  • 在Linux上安装go环境
  • 【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)
  • 1.2.3 使用Spring Initializr方式构建Spring Boot项目
  • 学习路程十一 langchain核心组件 Memory
  • 万能Prompt模板:三步打造高效Deep Research工作流
  • Python的pdf2image库将PDF文件转换为PNG图片
  • etcd 3.15 三节点集群管理指南
  • MySQL表字段数量上限解析
  • 【自学笔记】Oracle基础知识点总览-持续更新
  • 基于Spring Boot和Vue的餐饮管理系统设计与实现
  • PHP面试题--前端篇