1. 应用待机群组是啥?
Android 9 引入了一个新功能,叫应用待机群组。简单来说,就是根据你最近使用应用的频率和时间,系统会把应用分成不同的“群组”。每个群组的应用能用的系统资源不一样,比如后台任务、闹钟、网络请求啥的。系统会根据你用的多少,动态调整应用在哪个群组里。

2. 群组分类及限制
系统会把应用分成五个群组,每个群组的限制不一样。比如,你常用的应用会被分到ACTIVE群组,几乎没啥限制;而不常用的应用可能会被分到RARE群组,限制就多了。这些限制主要是为了省电,只有在用电池的时候才会生效,充电的时候就没这些限制了。
3. 群组分类及限制
|   群组 (Bucket)  |   Jobs (最长运行 10 分钟)  |   Alarms (最长运行 10 秒)  |   Network (临时恢复时长:10 分钟)  |   FCM 高优先级  | 
|   ACTIVE  |   无限制  |   无限制  |   无限制  |   无限制  | 
|   WORKING_SET  |   每 2 小时  |   每 6 分钟  |   无限制  |   无限制  | 
|   FREQUENT  |   每 8 小时  |   每 30 分钟  |   无限制  |   10 次/天,之后降级为普通  | 
|   RARE  |   每 24 小时  |   每 2 小时  |   每 24 小时  |   5 次/天,之后降级为普通  | 
|   NEVER  |   从不  |   从不  |   从不  |   从不  | 
4. 需要注意的几点
厂商自定义:每个手机厂商可以自己定标准,决定哪些应用是“不活跃”的。
别瞎折腾:开发者不应该试图去影响应用在哪个群组,而是应该确保应用在当前的群组里能正常运行。
查群组:应用可以通过调用 UsageStatsManager.getAppStandbyBucket() 来查自己当前在哪个群组。
白名单例外:如果应用在低电耗模式的白名单里,那这些群组限制就不适用了。
5.五个群组的特性
以下是五个应用待机群组的详细特性:
|   群组 (Bucket)  |   特性描述  |   示例场景  |   系统限制  | 
|   活跃 (Active)  |   用户当前正在使用应用,应用处于活跃状态。  |   - 应用已启动一个 Activity - 应用正在运行前台服务 - 应用的同步适配器与某个前台应用使用的 content provider 关联 - 用户在应用中点击了某个通知  |   无限制 系统不会对应用的作业、报警或 FCM 消息施加任何限制。  | 
|   工作集 (Working Set)  |   应用经常运行,但当前未处于活跃状态。  |   - 用户每天都会使用的社交媒体应用 - 应用被间接使用(如通过其他应用调用)  |   轻度限制 - 作业:每 2 小时运行一次 - 报警:每 6 分钟触发一次 - 网络:无限制 - FCM:无限制  | 
|   常用 (Frequent)  |   应用会定期使用,但不是每天都必须使用。  |   - 用户在健身房使用的锻炼跟踪应用 - 每周使用几次的应用  |   较强限制 - 作业:每 8 小时运行一次 - 报警:每 30 分钟触发一次 - 网络:无限制 - FCM 高优先级:每天最多 10 次,之后降级为普通优先级  | 
|   极少使用 (Rare)  |   应用不经常使用,偶尔才会用到。  |   - 用户仅在旅行时使用的酒店应用 - 每月使用几次的应用  |   严格限制 - 作业:每 24 小时运行一次 - 报警:每 2 小时触发一次 - 网络:每 24 小时连接一次 - FCM 高优先级:每天最多 5 次,之后降级为普通优先级  | 
|   从未使用 (Never)  |   应用安装后从未运行过。  |   - 用户下载但从未打开过的应用  |   极强限制 - 作业:从不运行 - 报警:从不触发 - 网络:从不连接 - FCM:从不接收  | 
简单总结一下:应用待机群组根据应用的使用频率和活跃状态,将应用分为五个等级。常用的应用资源多,不常用的资源少,这样既能保证用户体验,又能节省电量,一举两得!