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

Android 具有两项省电功能,可通过管理设备未连接到电源时应用的行为方式来延长电池续航时间:低电耗模式和应用待机模式。低电耗模式会在设备长时间未使用时延迟应用的后台 CPU 和网络活动,从而减少耗电量。应用待机模式会针对近期没有用户活动的应用推迟后台网络活动。

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

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

了解低电耗模式

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

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

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

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

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

低电耗模式限制

在低电耗模式下,系统会对您的应用施加以下限制:

低电耗模式核对清单

  • 如果可能,请使用 Firebase Cloud Messaging (FCM) 进行下行消息传递。
  • 如果您的用户必须立即看到通知,请使用 RemoteNotification 消息类型。如需更多指导,请参阅 FCM 文档 中有关 RemoteNotification 消息类型的内容。
  • 在初始消息载荷内提供充足的信息,这样就不需要后续网络访问。
  • 使用 setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 设置重要闹钟。
  • 在低电耗模式下测试应用。

使应用适应低电耗模式

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

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

低电耗模式对网络访问的限制也可能会影响您的应用,尤其是当应用依赖于实时消息(例如 tickle 或通知)时。如果您的应用需要与网络保持持久连接才能接收消息,请尽可能使用 Firebase Cloud Messaging (FCM)。

如需确认应用在低电耗模式下是否能按预期运行,您可以使用 adb 命令强制系统进入和退出低电耗模式,并观察应用的行为。如需了解详情,请参阅在低电耗模式和应用待机模式下进行测试。

了解应用待机模式

应用待机模式允许系统在用户未主动使用应用时判定该应用处于空闲状态。如果用户在一段时间内未轻触应用,并且不满足以下任何条件,系统就会做出此判断:

  • 用户明确启动应用。
  • 应用有一个进程当前在前台运行,作为 activity 或前台服务,或者正由另一个 activity 或前台服务使用。
  • 应用会生成一条通知,用户会在锁定屏幕或通知栏中看到该通知。

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

在设备空闲时使用 FCM 与应用交互

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

FCM 经过优化,可与低电耗模式和应用待机模式搭配使用。借助 FCM RemoteNotification 消息类型,您可以唤醒应用以吸引用户。在低电耗模式或应用待机模式下,系统会传递消息,并向应用授予对网络服务和部分唤醒锁定的临时访问权限,然后将设备或应用恢复到空闲状态。对于时效性强、用户可见的通知,请考虑使用 RemoteNotification 消息类型,以便在低电耗模式下传送。这些消息可能会导致通知。如需了解详情,请参阅 FCM 关于 RemoteNotification 的指南。

对于不会导致通知的消息(例如在后台使应用内容保持最新状态或启动数据同步),请使用 BackgroundSync FCM 消息。这些消息有意设置为低优先级,可能会延迟或受到限制,以优化设备电池。

作为一般最佳实践,如果您的应用需要下游消息传递,请使用 FCM。如果您的应用已使用 FCM,请确保它对会生成面向用户的通知的消息使用 RemoteNotification。

请勿在以下情况下使用 RemoteNotification:

  • 当通知肯定不会显示时。
  • 用于立即传递仅更新应用状态的消息,例如在后台使应用内容保持最新状态或启动数据同步。
  • 作为提示最终用户授予权限的一种方式。

对其他用例的支持

几乎所有应用都能够通过管理网络连接、闹钟、作业和同步以及使用 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 RemoteNotification 消息。

如需了解详情,请参阅对其他用例的支持。

类型 使用场景 是否可以使用 FCM? 是否可以豁免? 备注
即时通讯、聊天或通话应用。 需要在设备处于低电耗模式或应用处于应用待机模式时向用户传送实时消息。 是,使用 FCM 不可接受 使用 FCM RemoteNotification 消息唤醒应用并访问网络。
是,但未使用 FCM RemoteNotification 消息。
即时通讯、聊天或通话应用;企业 VoIP 应用。 否,由于对其他消息传递服务存在技术依赖,因此无法使用 FCM,或者低电耗模式和应用待机模式会破坏应用的核心功能。 可接受
“安全”应用。 可保障用户及其家人安全的应用。 如果适用。 可接受
任务自动化应用。 应用的核心功能是安排自动化操作,例如即时通讯、语音通话或新照片管理。 如果适用。 可接受
外围设备配套应用。 应用的核心功能是与外围设备保持持久连接,以便为外围设备提供互联网访问权限。 如果适用。 可接受
应用只需定期连接到外围设备进行同步,或只需连接到通过标准蓝牙配置文件连接的设备(例如无线耳机)。 如果适用。 不可接受