You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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模式的维护窗口:

  1. 监听Doze模式状态变更
    注册ACTION_DEVICE_IDLE_MODE_CHANGED广播,记录设备是否进入过Doze模式(即isDeviceIdleMode()返回true的状态)。

  2. 结合多状态判断维护窗口
    在通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:05:21