应用待机分组

Android 9(API 级别 28)及更高版本支持应用待机分组。应用待机分组可帮助系统根据应用最近和频繁的使用情况优先处理应用的资源请求。根据应用使用模式,每个应用都将被放置在一个优先级分组中。系统会根据应用所属的分组限制其可用的设备资源。

优先级分组

系统会动态地将每个应用分配到一个优先级分组,并根据需要重新分配应用。系统可能会依赖一个预加载的应用(该应用使用机器学习),以确定每个应用的使用可能性,并将应用分配到相应的分组。

如果设备上不存在系统应用,则系统默认为根据应用最近的使用情况对应用进行排序。活跃度更高的应用将被分配到优先级更高的分组,从而为应用提供更多系统资源。特别是,分组会确定应用作业运行的频率以及应用触发警报的频率。这些限制仅在设备使用电池供电时适用。当设备正在充电时,系统不会施加这些限制。

优先级分组如下所示:

  • 活跃:应用正在使用或最近使用。
  • 工作集:应用正在经常使用。
  • 频繁:应用经常使用,但不每天使用。
  • 偶尔:应用不经常使用。
  • 受限:应用消耗大量系统资源或可能表现出不良行为。

除了这些优先级分组之外,还有一个特殊的从不分组,用于已安装但从未运行的应用。系统会对这些应用施加严格的限制。

以下描述针对非预测性情况。相比之下,当预测使用机器学习预测行为时,存储桶的选择是根据用户接下来的操作预先确定的,而不是基于最近的使用情况。例如,最近使用的应用程序可能最终会被归入“罕用”存储桶,因为机器学习预测该应用程序在数小时内可能不会被使用。

活跃

当应用程序正在使用中、最近使用过或执行以下任何操作时,它处于活跃存储桶中:

  • 启动活动。
  • 运行长时间运行的前台服务。
  • 用户从通知点击它。

如果应用程序处于活跃存储桶中,系统不会对其作业或闹钟施加任何限制。

用户交互将应用设置为活跃状态

在 Android 9(API 级别 28)及更高版本中,当用户以某种方式与您的应用交互时,系统会暂时将您的应用置于活跃存储桶中。用户停止与您的应用交互后,系统会根据使用历史将其置于某个存储桶中。

以下是触发此系统行为的交互示例:

  • 用户点击您的应用发送的通知。

  • 用户通过点击媒体按钮与您应用中的前台服务进行交互。

  • 用户在与Android Automotive OS交互时连接到您的应用,其中您的应用使用前台服务或CONNECTION_TYPE_PROJECTION

工作集

如果应用程序经常运行但并非活跃状态,则它位于工作集存储桶中。例如,用户几乎每天都会启动的社交媒体应用程序很可能位于工作集中。如果间接使用应用程序,也会将其提升到工作集存储桶。

如果应用程序位于工作集中,系统会对其运行作业和触发闹钟的能力施加轻微限制。详情请参阅电源管理限制

常用

如果应用程序定期使用,但不一定是每天使用,则它位于常用存储桶中。例如,用户在健身房运行的健身追踪应用程序可能位于常用存储桶中。

如果应用程序位于常用存储桶中,系统会对其运行作业和触发闹钟的能力施加更严格的限制。详情请参阅电源管理限制

罕用

如果应用程序不经常使用,则它位于罕用存储桶中。例如,用户只在入住酒店期间运行的酒店应用程序可能位于罕用存储桶中。

如果应用程序位于罕用存储桶中,系统会对其运行作业和触发闹钟的能力施加严格限制。系统还会限制应用程序连接互联网的能力。详情请参阅电源管理限制

受限

此存储桶(在 Android 12(API 级别 31)中添加)优先级最低,限制最高。系统会考虑您的应用行为(例如用户与之交互的频率)来决定是否将您的应用置于受限存储桶中。

在 Android 13(API 级别 33)及更高版本中,除非您的应用符合豁免条件,否则系统会在以下情况下将您的应用置于受限存储桶中:

  • 用户在特定天数内未与您的应用交互。在 Android 12(API 级别 31)和 12L(API 级别 32)中,天数为 45 天。Android 13 将天数减少到 8 天。

  • 您的应用在 24 小时内调用了过多的广播绑定

如果系统将您的应用置于受限存储桶中,则会应用以下限制:

  • 您每天可以在 10 分钟的批量会话中运行作业一次。在此会话期间,系统会将您的应用的作业与其他应用的作业分组。
    • 受限作业不会自行运行。必须至少同时运行或挂起另一个作业,这可以包括任何其他作业。
  • 与系统将您的应用置于限制较少的存储桶中相比,您的应用可以运行更少的快速作业
  • 您的应用每天可以调用一个闹钟。此闹钟可以是精确闹钟非精确闹钟

受限存储桶的豁免

以下类型的应用程序无需进入受限存储桶,并且可以绕过非活动触发器,即使在 Android 12 及更高版本上也是如此:

评估优先级存储桶

要检查您的应用分配到的存储桶,请执行以下任一操作:

  • 调用getAppStandbyBucket()

  • 在终端窗口中运行以下命令:

    adb shell am get-standby-bucket PACKAGE_NAME

每当您的应用被放入其值为大于STANDBY_BUCKET_ACTIVE(10)的应用待机存储桶时,系统都会限制您的应用。

最佳实践

如果您的应用遵循休眠和应用待机的最佳实践,则后来的电源管理功能并不困难。但是,以前运行良好的某些应用行为可能会导致问题。

  • 不要试图操纵系统将您的应用放入某个特定的存储桶中。系统的优先级放置方法可能会发生变化,并且每个设备制造商都可能会选择使用其自己的算法编写自己的存储桶应用。相反,请确保您的应用无论位于哪个存储桶中都能正常运行。
  • 如果应用没有启动器活动,则可能永远不会将其提升到活跃存储桶。考虑重新设计您的应用以包含此类活动。
  • 如果用户无法与应用通知进行交互,则用户无法触发应用提升到活跃存储桶。在这种情况下,请考虑重新设计一些允许用户交互的通知。有关一些指南,请参阅 Material Design 的通知设计模式

  • 如果应用在收到高优先级 Firebase Cloud Messaging (FCM) 消息时不显示通知,则用户无法与应用交互,从而将其提升到活跃存储桶。实际上,高优先级 FCM 消息的唯一预期用途是向用户推送通知,因此这种情况绝不能发生。在 12L(API 级别 32)及更低版本中,如果您在不触发用户交互的情况下不当标记 FCM 消息为高优先级,则可能会导致以后的消息优先级降低。

  • 如果应用分布在多个包中,则这些包可能位于不同的存储桶中,并具有不同的访问级别。使用分配给各个存储桶的包测试这些应用,以确保应用正常运行。