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

概述:

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

  1. 后台服务的限制

1.1 前台应用无限制:

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

1.2 后台应用有时间限制:

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

1.3 临时白名单:

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

1.4 前台服务的特殊要求:

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

  1. 广播的限制

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。以下是具体的应对策略:对于正在进行的事件(如来电),应将通知与前台服务关联,以确保通知持续显示。

  1. 推荐的做法

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

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

4.2 前台服务 + 通知:

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

4.3 动态注册广播:

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

  1. 为什么要限制?

5.1 省电:

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

5.2 提升性能:

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

5.3 改善用户体验:

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

  1. 总结

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

相关推荐
西瓜本瓜@2 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
似霰5 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95278 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO9 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师9 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师9 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫9 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白10 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度
dpxiaolong11 小时前
RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
android·windows
tangweiguo0305198712 小时前
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
android