如何检测Android设备是否处于Doze模式的maintenance window?
检测Doze模式下的Maintenance Window状态
问题描述
我想要检测设备是否处于Doze模式的maintenance window,于是使用了以下代码:
//on receive alarm broadcast PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); boolean isDeviceIdleMode = pm.isDeviceIdleMode(); //do work
但发现该方法始终返回false。查阅文档后了解到:
如果设备处于长期空闲模式,但当前正运行限制已解除的maintenance window,该方法会返回false。
请问是否存在类似isDeviceInMaintenanceWindow的方法,或如何通过编程方式检测该状态?
解决方案
Android官方并未提供直接的isDeviceInMaintenanceWindow() API,但可通过状态组合判断间接识别设备是否处于Doze模式的维护窗口:
监听Doze模式状态变更
注册ACTION_DEVICE_IDLE_MODE_CHANGED广播,记录设备是否进入过Doze模式(即isDeviceIdleMode()返回true的状态)。结合多状态判断维护窗口
在通过setAndAllowWhileIdle()/setExactAndAllowWhileIdle()触发的闹钟广播或后台任务中,通过以下条件组合判定:isDeviceIdleMode()返回false- 设备未处于交互状态(
pm.isInteractive()返回false) - 此前已记录设备进入过Doze模式
示例代码
// 全局变量,记录设备是否进入过Doze模式 private boolean hasEnteredDoze = false; // 注册广播接收器监听Doze状态变化 private BroadcastReceiver dozeStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(intent.getAction())) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); hasEnteredDoze = pm.isDeviceIdleMode(); } } }; // 判断当前是否处于Doze维护窗口 private boolean isInDozeMaintenanceWindow(Context context) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); boolean isIdleModeActive = pm.isDeviceIdleMode(); boolean isDeviceInteractive = pm.isInteractive(); return !isIdleModeActive && !isDeviceInteractive && hasEnteredDoze; }
补充说明
维护窗口是Doze模式下设备短暂解除限制的时间段,此时应用可正常执行网络请求、后台任务等操作。上述方法是当前可行的非官方检测方案,因为Android未公开直接检测该状态的API。
内容的提问来源于stack exchange,提问作者Nilanka Manoj
相关产品推荐
相关产品推荐

