App Standby省电机制流程
1、流程图
在 Android 系统中,App Standby 是一种省电机制,通过限制未使用应用的后台活动来减少电量消耗。其核心逻辑在
UsageStatsService 和
AppIdleController 中实现,并通过系统广播(如 USB 连接状态和 IDLE 状态变化)触发相应的操作。
在 UsageStatsService 中,系统通过 isAppIdle 方法判断是否需要将应用囚禁。以下是应用不会被囚禁的例外情况:
1.系统应用:系统预装的应用不会进入 App Standby 状态。
2.包名为 "android" 的应用:核心系统组件不会被囚禁。
3.Doze 白名单中的应用:在 Doze 白名单中的应用不受限制。
4.正在活动的应用:当前正在前台运行或用户正在交互的应用不会被囚禁。
5.电话/短信相关应用:与电话、短信功能相关的应用不会被限制。
6.正在上传/下载的应用:正在进行网络传输的应用不会被囚禁。
7.绑定桌面小部件的应用:与桌面小部件绑定的应用不会被限制。
8.后台运行时间小于 5 秒的应用:短时间内进入后台的应用不会被囚禁。
2、架构图
3.理解 App Standby 模式
当用户一段时间未使用某个应用程序时,系统会将该应用标记为 App Standby(应用待机) 状态。在此状态下,系统会限制应用的后台活动(如网络访问、作业和同步),以节省电量。不过,如果满足以下任一条件,应用程序将不会进入 App Standby 状态:
用户主动启动应用:用户手动打开该应用。
应用具有前台进程:应用当前正在运行一个前台进程(例如,正在被一个 Activity 使用)。
应用显示可见通知:应用生成了一个用户可以在锁屏界面或通知托盘中看到的通知(例如,通过前台服务显示的通知)。
设备连接电源:当设备插入电源时,系统会解除应用的待机状态,允许其自由连接网络并执行未完成的任务和同步。
如果设备长时间处于空闲状态,系统会允许处于待机状态的应用 每天一次 访问网络,以便执行必要的后台任务。
4.测试 App Standby 模式
为了测试 App Standby 模式对应用程序的影响,可以按照以下步骤进行操作:
环境准备
确保测试设备(物理设备或虚拟设备)运行 Android 6.0(Marshmallow)或更高版本 的系统。
将设备连接到开发机,并安装待测试的应用程序。
运行应用程序
启动应用程序,并确保其运行某些活动(例如,触发后台任务或显示通知)。
强制进入 App Standby 模式
运行以下 ADB 命令,强制系统将应用程序设置为待机状态:
模拟设备断开电源(进入省电模式) adb shell dumpsys battery unplug 将应用程序设置为待机状态 adb shell am set-inactive <packageName> true <packageName>:替换为待测试应用程序的包名。
模拟唤醒应用程序
运行以下 ADB 命令,将应用程序从待机状态中唤醒:
将应用程序从待机状态中唤醒 adb shell am set-inactive <packageName> false 检查应用程序的待机状态 adb shell am get-inactive <packageName>
观察应用程序行为
检查应用程序从待机状态恢复后,其 通知 和 后台活动 是否符合预期。
确保应用程序在待机模式和正常模式之间的切换不会影响其核心功能。
4.App Standby 与 Doze 模式的区别
App Standby 和 Doze 是 Android 系统中两种不同的省电机制,它们的目标都是通过限制应用的后台活动来减少电量消耗,但它们的触发条件、管控范围和行为机制有所不同。以下是它们的核心区别:
特性 | Doze 模式 | App Standby |
触发条件 | 屏幕关闭 + 设备静止 | 应用进入后台一段时间(默认 2 小时) |
管控范围 | 唤醒锁、网络访问、后台任务、同步、Alarm | 网络访问、JobScheduler |
行为机制 | 逐步增加休眠时间,定期维护窗口 | 限制后台活动,用户交互或充电时解除限制 |