Android 13(API 级别 33)引入了以下省电措施:
- 更新了有关系统何时将您的应用放入“受限”应用待机模式存储分区的规则。您可以调用平台 API 来检查您的应用位于哪个存储分区。
- 对于您的应用在以下情况下可以执行的操作制定了新限制:用户因您应用的后台电池用量过高而将其置于“受限”状态。
- 新增了系统通知,用于就长时间运行的前台服务向用户发出警告。
关于应用何时会进入“受限”应用待机模式存储分区的规则更新
除非您的应用符合豁免条件,否则当您的应用出现以下任何行为时,系统就会将其放入受限存储分区:
用户有 8 天没有与您的应用互动。如果用户与另一个绑定到您应用的服务的应用互动,系统也会将您的应用视为“使用过”。
(仅限受支持的设备)您的应用在 24 小时内在后台消耗了大量的设备电池电量。此阈值取决于设备,特别是对于低 RAM 设备来说可能不同。
在衡量应用对设备电池续航时间的影响时,系统会考虑应用在几个不同方面执行的操作,包括:
- 作业(包括加急作业)
- 广播接收器
- 后台服务
- 系统是否已缓存应用的进程
用户互动可让您的应用退出“受限”存储分区
当用户与您的应用互动时(包括通过以下几种方式互动),系统会将应用从受限存储分区中移出,并放入另一个应用待机模式存储分区:
用户点按您的应用发送的通知。
用户在属于您应用的 widget 中执行操作。
用户通过按媒体按钮影响您应用的前台服务。
用户在与 Android Automotive OS 互动时连接到您的应用(您的应用在此过程中使用了前台服务或
CONNECTION_TYPE_PROJECTION
)。您的应用在画中画 (PiP) 模式下可见。
您的应用是屏幕上当前运行的应用之一。(主要适用于大屏设备。)
关于受限后台电池用量的新限制
使用现有 Android 版本的用户能够调整应用在后台运行时可以执行的工作量。系统设置中的电池用量页面上会显示以下选项:
- 无限制:允许后台工作,这可能会消耗更多电量。
- 优化(默认):根据用户与应用互动的方式,优化应用执行后台工作的能力。
- 受限:更注重延长设备的电池续航时间,而不是实现应用的全面功能。对于应用可以在后台执行的操作施加了更多限制。
自 Android 9(API 级别 28)起,处于“受限”状态的应用具有以下限制:
- 无法启动前台服务
- 现有的前台服务会从前台移除
- 不会触发闹钟
- 不会执行作业
当您的应用以 Android 13 为目标平台时,除非应用因其他原因启动,否则系统不会传送以下任何广播:
BOOT_COMPLETED
LOCKED_BOOT_COMPLETED
与长时间运行的前台服务相关的系统通知
如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与前台服务 (FGS) 任务管理器互动。该通知包含以下内容:
APP is running in the background for a long time. Tap to review.
如果满足以下任一条件,系统将不会显示此通知:
- 显示了与前台服务相关的通知。也就是说,用户尚未滑动关闭相应通知。
- 前台服务的类型为
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
或FOREGROUND_SERVICE_TYPE_LOCATION
。
此外,如果您的应用在 24 小时内运行超过 4 小时的前台服务属于 FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
或 FOREGROUND_SERVICE_TYPE_LOCATION
类型,则系统不会针对您的应用启动的任何前台服务发送长时间运行通知。
豁免
存在以下情况的应用不会受到 Android 13 中引入的任何省电措施的影响:
- 系统应用和系统绑定应用
- 配套设备应用
- 处于演示模式的设备上运行的应用
- 设备所有者应用
- 资料所有者应用
- 常驻应用
- VPN 应用
- 具有
ROLE_DIALER
角色的应用 - 用户在系统设置中明确指定提供“无限制”功能的应用
在以下情况下,您的应用可以免于进入“受限”应用待机模式存储分区,并可以绕过“8 天无活动”触发器:
- 具有活跃的 widget
- 至少被授予下列其中一种权限:
在以下情况下,您的应用可以不受 Android 13 中引入的大多数省电措施的影响,但系统仍然会发送针对长时间运行的前台服务的通知:
- 具有进行中的活跃
MediaSession
- 至少被授予下列其中一种权限:
测试
以下几个部分将介绍几种测试 Android 13 中引入的省电措施会对应用产生何种影响的方式。
禁止在后台使用
如需禁止您的应用在后台运行,请在终端窗口中运行以下命令:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND deny
将应用放入受限存储分区
如需强制系统将您的应用放入受限存储分区,请在终端窗口中运行以下命令:
adb shell am set-standby-bucket PACKAGE_NAME restricted