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

Android技术咨询:如何识别设备是否进入/退出Doze模式及当前状态?

Android Doze模式检测与状态监听

一、判断设备当前是否处于Doze模式

从Android 6.0(API 23)开始,系统提供PowerManager类直接判断设备Doze状态:

// Kotlin示例
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val isInDozeMode = powerManager.isDeviceIdleMode()
// Java示例
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isInDozeMode = powerManager.isDeviceIdleMode();

isDeviceIdleMode()返回true表示设备处于Doze模式(含维护窗口阶段);返回false则设备处于正常活动状态。

二、监听Doze模式的进入与退出

系统会在Doze状态变化时发送ACTION_DEVICE_IDLE_MODE_CHANGED广播,通过动态注册广播接收器可监听状态切换(适配Android 8.0+):

广播接收器实现

// Kotlin示例
class DozeMonitorReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (Intent.ACTION_DEVICE_IDLE_MODE_CHANGED == intent?.action) {
            val powerManager = context?.getSystemService(Context.POWER_SERVICE) as PowerManager
            val isInDozeMode = powerManager.isDeviceIdleMode()
            if (isInDozeMode) {
                // 设备进入Doze模式
            } else {
                // 设备退出Doze模式
            }
        }
    }
}
// Java示例
public class DozeMonitorReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(intent.getAction())) {
            PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            boolean isInDozeMode = powerManager.isDeviceIdleMode();
            if (isInDozeMode) {
                // 设备进入Doze模式
            } else {
                // 设备退出Doze模式
            }
        }
    }
}

注册与注销接收器

在Activity/Service的生命周期内完成注册和注销:

// Kotlin示例
val receiver = DozeMonitorReceiver()
val filter = IntentFilter(Intent.ACTION_DEVICE_IDLE_MODE_CHANGED)
registerReceiver(receiver, filter)

// 如在onDestroy中注销
override fun onDestroy() {
    super.onDestroy()
    unregisterReceiver(receiver)
}
// Java示例
DozeMonitorReceiver receiver = new DozeMonitorReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_DEVICE_IDLE_MODE_CHANGED);
registerReceiver(receiver, filter);

// 如在onDestroy中注销
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

关键注意事项

  • Android 8.0(API 26)及以上版本,静态注册该广播会被系统限制,必须使用动态注册。
  • 无需额外申请权限,系统默认允许应用接收该广播。

三、关于Doze维护窗口的补充判断

Doze模式下的维护窗口阶段,isDeviceIdleMode()仍会返回true,但系统会临时解除部分后台限制。若需让应用在此阶段执行任务,推荐使用JobScheduler或WorkManager,系统会自动在维护窗口调度任务执行。

若需让应用在Doze模式下执行关键任务,可考虑使用高优先级FCM消息,或申请REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限(需用户手动授权,需合理使用避免应用被拒)。


内容的提问来源于stack exchange,提问作者SaurabhG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:15