Android 9(API 级别 28)及更高版本支持应用待机存储分区。应用待机存储分区有助于系统根据应用的使用时间新近度和使用频率对应用资源请求确定优先级。 根据应用使用模式,每个应用都会被放置在五个优先级存储分区之一中。系统会根据应用所在的存储分区限制每个应用可用的设备资源。
优先级存储分区
系统会动态地将每个应用分配到优先级存储分区,并根据需要重新分配应用。系统可能依赖于某个预加载的应用,该应用使用机器学习判断每个应用将被使用的可能性,并将应用分配到相应的存储分区。如果设备上没有该系统应用,系统会默认根据应用的使用时间新近度对应用进行排序。系统会将更活跃的应用分配到为应用赋予更高优先级的存储分区,从而为应用提供更多系统资源。具体而言,存储分区决定了应用的作业运行频率以及应用可以触发闹钟的频率。这些限制仅适用于设备使用电池供电的情况;在设备充电期间,系统不会对应用施加这些限制。
注意:每个制造商都可以针对将非活跃应用分配到存储分区的方式设定自己的标准。您不应尝试影响应用分配到哪个存储分区,而应专注于确保您的应用在可能处于的任何存储分区中都运行良好。您的应用可以通过调用
UsageStatsManager.getAppStandbyBucket()
查明其当前所在的存储分区。
这些存储分区为:
此外,对于已安装但从未运行过的应用,还有一个特殊的从未使用存储分区。系统会对这些应用施加严格的限制。
注意:低电耗模式豁免列表中的应用无需遵守基于应用待机存储分区的限制。
注意:以下说明适用于非预测性的情况。否则,当预测功能使用机器学习预测行为时,会根据对用户后续操作的预测(而不是使用时间的新近度)选择存储分区。例如,最近使用的应用可能会出现在极少使用的存储分区中,因为机器学习预测该应用在数小时内不会使用。
活跃
如果用户当前正在使用某个应用或最近刚刚使用过该应用,则该应用位于活跃存储分区中。例如:
- 该应用启动了一个 activity
- 该应用正在运行一项前台服务
- 该应用具有与前台应用使用的 content provider 相关联的同步适配器
- 用户点按了应用通知
如果应用位于“活跃”存储分区中,系统不会对应用的作业或闹钟施加任何限制。
用户互动会将应用放在“活跃”存储分区中
在 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 天。
如果系统将您的应用放在“受限”存储分区中,会受到以下限制:
- 您每天可以在 10 分钟的批处理会话中运行作业一次。在此会话期间,系统会将您应用的作业与其他应用的作业聚在一起。
- 受限作业不能独自运行,必须至少还有另一项作业(可以是任何其他作业)与其同时运行/待处理。
- 与系统将您的应用放在限制较少的存储分区中相比,您的应用可以运行的加急作业更少。
- 您的应用每天可以调用一次闹钟。此闹钟可以是精确闹钟或不精确闹钟。
免于进入“受限”存储分区
以下类型的应用可免于进入“受限”应用待机存储分区,并且可以绕过非活跃触发器,即使在 Android 12 及更高版本上也是如此:
- 配套设备应用
- 处于演示模式的设备上运行的应用
- 设备所有者应用
- 资料所有者应用
- 常驻应用
- VPN 应用
- 具有
ROLE_DIALER
角色的应用 - 用户在系统设置中明确指定提供“无限制”功能的应用
- 具有活跃 widget 的应用
- 在画中画 (PiP) 模式下可见的应用
- 屏幕上当前运行的应用之一
- 至少被授予下列其中一种权限的应用:
最佳实践
如果您的应用已经遵循低电耗模式和应用待机模式的最佳实践,那么处理新的电源管理功能应该不难。不过,以前运行良好的某些应用行为现在可能会导致问题。
- 请勿试图迫使系统将您的应用放到某个特定的存储分区中。系统的分区方法可能会发生变化,并且每个设备制造商都可以选择使用自己的算法编写自己的分区应用。您应该确保您的应用无论位于哪个存储分区都运行正常。
- 没有启动器 activity 的应用可能永远不会被提升到“活跃”存储分区。您可能需要重新设计应用,使其具有此类 activity。
- 如果应用的通知不可操作,用户将无法与通知互动,也就无法触发应用提升到“活跃”存储分区的操作。在这种情况下,您可能需要通过重新设计,使一些相应的通知允许用户做出响应。如需了解一些相关准则,请参阅 Material Design 通知设计模式。
- 同样,如果应用在收到高优先级 Firebase Cloud Messaging (FCM) 消息时不显示通知,用户也没有机会与应用互动并促使系统将应用提升到“活跃”存储分区。事实上,高优先级 FCM 消息的唯一预期用途就是向用户推送通知,因此不应出现这种情况。在 Android 12L(API 级别 32)及更低版本中,如果您将不会触发用户互动的 FCM 消息误标为高优先级,会导致系统降低后续消息的优先级。
注意:如果用户屡次忽略某个通知,系统会为用户提供以后屏蔽该通知的选项。请勿仅仅为了让应用保持在“活跃”存储分区中而向用户发送大量通知!
- 如果应用拆分为多个软件包,这些软件包可能位于不同的存储分区中,并因此具有不同的访问权限级别。对于软件包会分配到不同存储分区的此类应用,您应该进行测试,以确保该应用运行正常。
测试
如需检查您的应用位于哪个存储分区中,请执行以下一项操作:
- 调用
getAppStandbyBucket()
。 -
在终端窗口中运行以下命令:
adb shell am get-standby-bucket PACKAGE_NAME
当您的应用位于值大于 STANDBY_BUCKET_ACTIVE
(10) 的应用待机存储分区中时,系统会对您的应用加以限制。