很多桌面应用需要感知系统的运行状态:比如当用户离开电脑一段时间后自动锁定界面,或者当设备切换到电池供电时降低数据同步频率以节省电量。Electron 提供了 powerMonitor 和 powerSaveBlocker 两个模块来应对这些场景,让你能方便地监听电源状态、屏幕锁定以及系统空闲状态。
11.4.1 监听电源状态变化
powerMonitor 可以告诉你当前设备在使用交流电还是电池,以及电源状态何时发生切换。
const { powerMonitor } = require('electron');
// 监听电源状态变化
powerMonitor.on('on-ac', () => {
console.log('已接通电源');
// 可以恢复高性能模式,例如提高数据同步频率
});
powerMonitor.on('on-battery', () => {
console.log('已切换到电池供电');
// 降低后台任务频率,减少电量消耗
});
如果需要在应用启动时立刻获取当前状态,可以使用 powerMonitor.isOnBatteryPower()(返回 true 表示正在使用电池)。注意这个方法是异步的,在一些系统上可能需要短暂的初始化时间。
11.4.2 屏幕锁定与解锁
许多安全敏感的应用会在用户锁定屏幕时自动锁定自身界面,或在解锁后要求重新验证。powerMonitor 同样支持这类事件。
powerMonitor.on('lock-screen', () => {
// 用户锁定系统(Windows/Linux)或合上 Mac 笔记本盖子
// 可以在此处清除敏感数据、停止音频播放、暂停计时器等
});
powerMonitor.on('unlock-screen', () => {
// 系统解锁,可以恢复界面或提示用户重新登录
});
需要注意的是,macOS 上的 lock-screen 和 unlock-screen 事件仅在笔记本合盖或通过系统菜单锁屏时触发;而 Windows 下通过 Win + L 锁屏或解锁都会正常触发。
11.4.3 系统空闲状态检测
Electron 直接提供了两个同步 API 来查询用户的空闲时间:
const idleTime = powerMonitor.getSystemIdleTime(); // 返回空闲秒数
console.log(`系统已空闲 ${idleTime} 秒`);
const idleState = powerMonitor.getSystemIdleState(60); // 检测空闲是否超过指定秒数
if (idleState === 'idle') {
console.log('用户超过 60 秒未操作');
} else if (idleState === 'locked') {
console.log('系统已锁定或屏幕保护已启动');
} else {
console.log('用户处于活动状态');
}
getSystemIdleState(threshold) 会返回三种状态:
'active':空闲时间小于阈值'idle':空闲时间超过阈值但系统未锁定'locked':系统已锁屏或启动了屏幕保护
有时我们需要在用户长时间无操作时自动执行某个动作(如暂停视频播放、触发自动保存、调整在线状态)。可以通过定时轮询空闲时间来实现:
setInterval(() => {
const idleSeconds = powerMonitor.getSystemIdleTime();
if (idleSeconds > 300) { // 超过 5 分钟
// 触发相应的空闲逻辑
}
}, 10000); // 每 10 秒检查一次
但更可靠的方式是结合 powerMonitor 的空闲状态变化和锁屏事件,减少不必要的定时器开销。
11.4.4 防止系统休眠
某些应用(例如下载管理器、视频播放器、会议工具)需要在执行关键任务时阻止系统进入睡眠或关闭屏幕。powerSaveBlocker 模块就是为此设计的。
const { powerSaveBlocker } = require('electron');
// 启动阻止,返回一个阻止器 ID
const id = powerSaveBlocker.start('prevent-display-sleep');
console.log(`阻止器 ID: ${id}`);
// 当任务完成后,停止阻止
powerSaveBlocker.stop(id);
start 方法接受一个类型参数:
'prevent-app-suspension':防止应用被系统挂起,但允许屏幕关闭。'prevent-display-sleep':同时防止屏幕关闭(更耗电,谨慎使用)。
在不需要阻止时务必调用 stop(id),否则系统将一直无法正常休眠,严重影响电池续航。一个常见的最佳实践是在“开始播放视频”时启动阻止,在“暂停/停止播放”或窗口关闭时停止阻止。
11.4.5 实践要点与注意事项
- 平台差异:Linux 下的电源状态事件可能部分不支持,
getSystemIdleState通常在 X11 下工作正常,在 Wayland 下可能受限。对于跨平台应用,应当在对应平台上进行充分测试。 - 隐私与安全:检测空闲状态本身不需要特别的权限,但请勿滥用。频繁检查用户空闲可能触发安全软件的注意。
- 节能意识:尽量在
on-battery事件中降低后台活动(如停止不必要的动画、降低心跳频率),这不仅改善用户体验,也能避免你的应用被用户标记为“耗电大户”。 - 空闲状态上报:可以配合主进程向渲染进程广播空闲状态变化,让界面层能够动态显示“离开状态”或自动锁定。
通过上述几个 API,你可以轻松为 Electron 应用加入智能化的电源管理行为。无论是省电优化、自动锁定还是任务保活,代码量都不大,但对应用的成熟度和用户好感度提升非常明显。