针对低电耗模式和应用待机模式进行优化

Android 拥有两项省电功能,通过管理设备未连接电源时应用的行为来延长用户电池续航时间:低电耗模式 (Doze) 和应用待机模式 (App Standby)。 低电耗模式 通过延迟设备长时间未使用时应用的后台 CPU 和网络活动来降低电池消耗。 应用待机模式 延迟没有近期用户活动的应用的后台网络活动。

设备处于低电耗模式时,应用对某些耗电资源的访问会被延迟,直到维护窗口。 具体限制列在电量管理限制中。

低电耗模式和应用待机模式管理在 Android 6.0 或更高版本上运行的所有应用的行为,无论它们是否专门针对 API 级别 23。为了帮助确保为用户提供最佳体验,请在低电耗模式和应用待机模式下测试您的应用,并对您的代码进行任何必要的调整。以下部分提供详细信息。

了解低电耗模式

如果用户将设备拔下电源并长时间静置,且屏幕关闭,设备就会进入低电耗模式。在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电池电量。它还会阻止应用访问网络,并延迟其作业、同步和标准闹钟。

系统会定期短暂退出低电耗模式,让应用完成其延迟的活动。在此 维护窗口 期间,系统会运行所有待处理的同步、作业和闹钟,并允许应用访问网络。

图 1. 低电耗模式为应用提供了一个定期维护窗口,供其使用网络和处理待处理的活动。

维护窗口结束后,系统会再次进入低电耗模式,暂停网络访问并延迟作业、同步和闹钟。随着时间的推移,系统安排维护窗口的频率会降低,有助于在设备未充电且长时间不活动的情况下减少电池消耗。

当用户通过移动设备、打开屏幕或连接充电器来唤醒设备时,系统会退出低电耗模式,所有应用都会恢复正常活动。

低电耗模式限制

设备处于低电耗模式时,系统会对您的应用施加以下限制:

低电耗模式清单

使您的应用适应低电耗模式

低电耗模式对应用的影响各不相同,具体取决于它们提供的功能和使用的服务。许多应用在低电耗模式循环中无需修改即可正常运行。在某些情况下,您必须优化应用管理网络、闹钟、作业和同步的方式。应用必须能够在每个维护窗口期间高效管理活动。

为了帮助安排闹钟,您可以使用两种 AlarmManager 方法:setAndAllowWhileIdle()setExactAndAllowWhileIdle()。使用这些方法,您可以设置即使设备处于低电耗模式也能触发的闹钟。

低电耗模式对网络访问的限制也可能会影响您的应用,特别是当应用依赖实时消息(如提醒或通知)时。如果您的应用需要持续连接到网络以接收消息,如果可能,请使用 Firebase Cloud Messaging (FCM)

为确认您的应用在低电耗模式下行为正常,您可以使用 adb 命令强制系统进入和退出低电耗模式并观察您应用的行为。有关详细信息,请参阅使用低电耗模式和应用待机模式进行测试

了解应用待机模式

应用待机模式让系统能够在用户不主动使用应用时判断应用处于空闲状态。当用户在一段时间内未触摸应用且不符合以下任何条件时,系统会做出此判断:

  • 用户明确启动了应用。
  • 应用有进程当前在前台运行,无论是作为 activity 还是前台服务,或者被另一个 activity 或前台服务使用。
  • 应用生成用户在锁定屏幕或通知托盘中看到的通知。

当用户将设备插入电源时,系统会将应用从待机状态中释放,让它们可以自由访问网络并执行任何待处理的作业和同步。如果设备长时间处于空闲状态,系统大约每天允许空闲应用访问网络一次。

在设备空闲时使用 FCM 与您的应用互动

Firebase Cloud Messaging (FCM) 是一项云到设备服务,可让您支持后端服务与 Android 设备上的应用之间的实时下行消息传递。FCM 提供到云端的单个持久连接。所有需要实时消息传递的应用都可以共享此连接。这种共享连接通过消除多个应用维护自己独立的持久连接的必要性,显著优化了电池消耗,因为独立的持久连接会迅速耗尽电池电量。因此,如果您的应用需要与后端服务集成消息传递,我们强烈建议您尽可能使用 FCM,而不是维护您自己的持久网络连接。

FCM 已优化,可与低电耗模式和应用待机空闲模式配合使用。FCM 高优先级消息可让您唤醒应用以吸引用户。在低电耗模式或应用待机模式下,系统会传递消息并赋予应用对网络服务和部分唤醒锁的临时访问权限,然后将设备或应用返回到空闲状态。对于时间敏感、用户可见的通知,请考虑使用高优先级消息以实现在低电耗模式下的传递。高优先级消息可以产生通知。有关更多信息,请参阅 FCM 关于高优先级消息的指导

对于不会产生通知的消息,例如在后台保持应用内容最新或启动数据同步,请使用普通优先级 FCM 消息。如果设备未处于低电耗模式,普通优先级消息会立即传递。如果设备处于低电耗模式,它们会在定期低电耗模式维护窗口期间传递,或者在用户唤醒设备后立即传递。

作为一般最佳实践,如果您的应用需要下行消息传递,请使用 FCM。如果您的应用已使用 FCM,请确保它仅对产生用户可见通知的消息使用高优先级消息。

对其他用例的支持

几乎所有应用都可以通过管理网络连接、闹钟、作业和同步以及使用 FCM 消息来支持低电耗模式。对于一小部分用例,这可能不够。对于此类情况,系统提供了一个可配置的应用列表,这些应用可以部分免除低电耗模式和应用待机模式的优化。

部分豁免的应用可以在低电耗模式和应用待机模式期间使用网络并持有部分唤醒锁。但是,其他限制仍然适用于该应用,就像它们适用于其他应用一样。例如,在 API 级别 23 及以下,应用的作业和同步会被延迟,并且其常规 AlarmManager 闹钟不会触发。应用可以通过调用 isIgnoringBatteryOptimizations() 来检查其当前是否在豁免列表中。

用户可以在 “设置”>“电池”>“电池优化” 中手动配置豁免应用列表。此外,系统还提供了应用请求用户豁免它们的方式:

应用可以通过调用 isIgnoringBatteryOptimizations() 来检查其当前是否在豁免列表中。

使用低电耗模式和应用待机模式进行测试

为了帮助确保为您的用户提供出色的体验,请在低电耗模式和应用待机模式下全面测试您的应用。

使用低电耗模式测试您的应用

您可以通过以下步骤测试低电耗模式:

  1. 配置搭载 Android 6.0(API 级别 23)或更高版本系统映像的硬件设备或虚拟设备。
  2. 将设备连接到您的开发机器并安装您的应用。
  3. 运行您的应用并使其保持活动状态。
  4. 通过运行以下命令强制系统进入空闲模式:
        $ adb shell dumpsys deviceidle force-idle
        
  5. 准备就绪后,通过运行以下命令退出空闲模式:
        $ adb shell dumpsys deviceidle unforce
        
  6. 通过执行以下命令重新激活设备:
        $ adb shell dumpsys battery reset
        
  7. 重新激活设备后,观察您的应用行为。确保当设备退出低电耗模式时,应用能够正常恢复。

使用应用待机模式测试您的应用

要使用您的应用测试应用待机模式,请执行以下操作:

  1. 配置搭载 Android 6.0(API 级别 23)或更高版本系统映像的硬件设备或虚拟设备。
  2. 将设备连接到您的开发机器并安装您的应用。
  3. 运行您的应用并使其保持活动状态。
  4. 通过运行以下命令强制应用进入应用待机模式:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. 使用以下命令模拟唤醒您的应用:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. 唤醒应用后,观察其行为。确保应用能够从待机模式中正常恢复。特别是,检查您应用的通知和后台作业是否按预期运行。

豁免的可接受用例

下表重点列出了几种用例,以及应用在这些情况下使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent 操作是否可接受。通常,除非低电耗模式或应用待机模式破坏了应用的核心功能,或者您的应用无法使用 FCM 高优先级消息存在技术原因,否则您的应用不符合这些例外情况。

如需了解更多信息,请参阅对其他用例的支持

类型 用例 可以使用 FCM 吗? 豁免可接受吗? 备注
即时消息、聊天或通话应用。 需要在设备处于低电耗模式或应用处于应用待机模式时向用户传递实时消息。 是,使用 FCM 不可接受 使用 FCM 高优先级消息唤醒应用并访问网络。
是,但未使用 FCM 高优先级消息。
即时消息、聊天或通话应用;企业 VOIP 应用。 否,不能使用 FCM,因为技术上依赖于其他消息服务,或者低电耗模式和应用待机模式破坏了应用的核心功能。 可接受
安全应用。 保护用户及其家人安全的应用程序。 如果适用。 可接受
任务自动化应用。 应用的核心功能是安排自动化操作,例如即时消息、语音通话或新照片管理。 如果适用。 可接受
外围设备伴侣应用。 应用的核心功能是与外围设备保持持久连接,以便为外围设备提供互联网访问。 如果适用。 可接受
应用只需要定期连接外围设备以进行同步,或者只需要连接通过标准蓝牙配置文件连接的设备,例如无线耳机。 如果适用。 不可接受