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

Android 13充电时屏幕持续唤醒,如何优化充电通知忽略逻辑?

更优的充电时屏幕唤醒控制方案

你的现有方案只过滤com.android.systemui的通知,虽然能解决部分问题,但存在局限性——充电时触发屏幕唤醒的可能不止这个系统组件的通知,比如系统充电状态广播、第三方充电APP的唤醒请求,都可能导致屏幕持续亮起。这里给你几个更精准的实现思路:

1. 唤醒前先检测充电状态

在执行屏幕唤醒逻辑前,先判断设备是否处于充电状态,如果是则跳过唤醒操作,从源头避免无效唤醒。

示例代码:

// 获取系统服务实例
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);

// 判断设备是否处于充电/充满状态
boolean isCharging = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS) 
    == BatteryManager.BATTERY_STATUS_CHARGING 
    || batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS) 
    == BatteryManager.BATTERY_STATUS_FULL;

// 充电状态下直接返回,不执行唤醒
if (isCharging) {
    return;
}

// 你的屏幕唤醒逻辑
if (!powerManager.isInteractive()) {
    powerManager.wakeUp(System.currentTimeMillis(), "com.your.package.WAKE_REASON");
}

2. 动态监听充电状态调整服务行为

注册充电状态变化的广播,当设备进入充电状态时暂停唤醒逻辑,退出充电时恢复,适配状态变化更灵活。

示例代码:

定义充电状态广播接收器

private boolean isChargingMode = false;
private BroadcastReceiver chargingReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_POWER_CONNECTED.equals(action)) {
            // 充电开始,标记为充电模式
            isChargingMode = true;
        } else if (Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
            // 充电结束,取消充电模式
            isChargingMode = false;
        }
    }
};

在服务启动时注册广播

@Override
public void onCreate() {
    super.onCreate();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_POWER_CONNECTED);
    filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
    registerReceiver(chargingReceiver, filter);
}

在唤醒逻辑中判断模式

if (isChargingMode) {
    return;
}
// 执行你的唤醒操作

3. 优化唤醒锁的使用(如果用到的话)

如果你的服务使用WakeLock维持屏幕亮起,要确保充电时及时释放锁,或不获取锁:

WakeLock wakeLock = powerManager.newWakeLock(
    PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 
    "YourApp:WakeTag"
);

if (!isCharging) {
    wakeLock.acquire(10000); // 设置合理的超时时间,避免长期持有
} else {
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}

现有方案的不足说明

硬编码过滤com.android.systemui的通知不够健壮:部分定制ROM的系统UI包名可能不同,而且充电时的唤醒触发源可能来自其他系统组件(比如电源管理服务)或第三方应用,只过滤单个包名无法覆盖所有场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:07:49