Skip to content

electron 系统休眠、睡眠、锁屏、屏幕超时的区别

electron 的应用,在锁屏、休眠、睡眠、屏幕超时导致的睡眠,是否会导致电脑断网、暂停应用影响

作为 Windows 上 Electron 应用开发者,关于不同电源状态对应用的影响,以下是详细的说明:

1. 锁屏(Lock Screen)

  • 断网情况: 不会导致断网,网络连接正常保持。

  • 应用状态:

    • Electron 应用继续运行。
    • 应用内计时器、后台任务不会中断,正常执行。

2. 睡眠(Sleep)

  • 断网情况: 会暂时中断网络连接。

  • 应用状态:

    • 操作系统暂停应用的执行,程序状态保存在内存中,但进程不再继续执行。
    • 唤醒后,应用进程恢复运行,Electron 应用继续从暂停处恢复。

影响:

  • 如果应用需实时联网数据交互,睡眠期间无法工作。
  • 计时器或后台服务暂停运行,唤醒后会恢复。

3. 休眠(Hibernate)

  • 断网情况: 断网,网络连接完全中止。

  • 应用状态:

    • 应用的状态被写入磁盘后完全暂停,进程彻底停止。
    • 恢复时状态从磁盘重新载入,Electron 应用的运行状态会从停止点恢复。

影响:

  • 进程完全中止后再启动,应用内的计时器或实时数据交互停止。
  • 唤醒时,进程从内存状态恢复,类似睡眠但恢复时间稍长。

4. 屏幕超时(仅屏幕关闭、电脑未睡眠)

  • 断网情况: 不断网,网络连接持续正常。

  • 应用状态:

    • Electron 应用进程继续正常运行,不受屏幕关闭影响。
    • 后台任务、计时器均正常执行。

应用开发时的建议:

  • 检测睡眠/休眠事件: Electron 可以监听系统电源事件(如使用 powerMonitor):

    javascript
    const { powerMonitor } = require("electron");
    
    powerMonitor.on("suspend", () => {
      console.log("系统将进入睡眠/休眠模式");
    });
    
    powerMonitor.on("resume", () => {
      console.log("系统从睡眠/休眠模式唤醒");
    });
  • 网络状态监控: 应用应监控网络连接状态(例如,使用 navigator.onLine 或监听网络变化事件)。

  • 状态持久化: 当监听到 suspend 事件时,尽可能保存关键状态,避免因休眠而中断任务导致数据丢失。

总结:

状态是否断网应用是否暂停运行备注
锁屏❌ 不断网❌ 不暂停应用完全正常运行
睡眠✔️ 断网✔️ 暂停应用暂停后从内存恢复,渲染进程会重新加载
休眠✔️ 断网✔️ 完全暂停应用暂停后从磁盘恢复,渲染进程会重新加载
屏幕超时❌ 不断网❌ 不暂停仅屏幕关闭,应用后台正常

整体而言,休眠和睡眠模式都会使 Electron 应用的运行暂时中断,影响实时联网任务;锁屏和屏幕超时则不影响应用正常运行。

锁屏后一般多久应用会转为睡眠或者休眠状态?

在 Windows 系统中,锁屏与电脑进入睡眠或休眠状态之间并没有直接关联。具体取决于系统设置的电源选项:

🔑 锁屏状态:

  • 仅锁定界面,不会自动导致电脑进入睡眠或休眠。
  • 锁屏本质上只是安全措施,不节省电量,也不会中断应用。

🕒 自动进入睡眠或休眠的规则:

默认情况下,Windows 系统的睡眠或休眠模式由电源设置中的空闲时间决定:

  • 典型默认值:

    • 笔记本电脑:

      • 未插电源时,一般默认 15 分钟到 30 分钟 后自动进入睡眠。
      • 插入电源后,可能默认更长,比如 1 小时或从不
    • 台式电脑:

      • 默认可能较长,如 30 分钟到 1 小时或更久,甚至从不。
  • 系统进入休眠模式通常要比睡眠更长,或根据用户自定义设置(如睡眠一段时间后自动转入休眠)。

📌 如何查看或更改系统的设置:

  • 进入 控制面板 → 电源选项 → 更改计划设置 → 更改高级电源设置
  • 查看 睡眠休眠 的具体配置。

⚙️ Electron 应用相关注意:

  • 如果想要避免应用因空闲而进入睡眠状态,可以在 Electron 中使用 powerSaveBlocker API。

  • 例如:

    javascript
    const { powerSaveBlocker } = require("electron");
    const id = powerSaveBlocker.start("prevent-app-suspension");
    
    console.log(powerSaveBlocker.isStarted(id)); // true

总结:

  • 锁屏不会自动导致睡眠或休眠。
  • 睡眠或休眠取决于系统预设空闲时间,用户可自定义。
  • Electron 应用可以用内置 API 控制避免应用进入睡眠或休眠。

electron powerSaveBlocker 的 prevent-app-suspension 与 prevent-display-sleep 有啥区别

在 Electron 中,powerSaveBlocker 提供了两种类型:

  • prevent-app-suspension
  • prevent-display-sleep

它们的作用和适用场景有所不同:

📌 区别:

类型功能描述适用场景示例
prevent-app-suspension防止 应用程序 进入睡眠或休眠状态。
应用后台任务和网络保持活动。
后台下载、持续上传任务、音乐播放、长时间计算。
prevent-display-sleep防止 屏幕 进入关闭或节能状态。
屏幕一直亮着。
视频播放、演示应用、电子阅读器。

⚙️ 详细解释:

1. prevent-app-suspension

  • 阻止系统进入睡眠、休眠,确保应用持续在后台运行。
  • 但不保证屏幕保持唤醒状态。屏幕仍可关闭或锁定,但电脑本身不会进入睡眠。

适用场景示例:

  • 文件传输、数据同步。
  • 持续运行服务器或后台任务的应用。

2. prevent-display-sleep

  • 保证屏幕持续亮起。
  • 同时隐含地阻止系统进入睡眠,因为屏幕的关闭通常是睡眠的前兆。

适用场景示例:

  • 视频播放器。
  • PPT、电子白板等演示工具。

🔍 小结:

  • prevent-app-suspension → 应用持续活跃,但屏幕可能关闭。
  • prevent-display-sleep → 应用持续活跃,且屏幕一定亮起。

根据你的需求(后台任务、屏幕显示)选择合适的模式即可。

prevent-app-suspension 也就是说电脑进入了睡眠,但是应用不会睡眠是这个意思吗?

不是这个意思。这里有个常见的误区:

  • Electron 的 prevent-app-suspension 并非电脑已经进入睡眠,但应用还在运行(电脑睡眠后,一切进程都被暂停,包括 Electron 应用)。

  • 它的实际作用是:阻止系统进入睡眠或休眠状态

换句话说:

  • 当你启用 prevent-app-suspension 后,电脑根本不会进入睡眠或休眠(只要这个阻止器在生效状态)。
  • 如果用户手动强制睡眠或休眠(比如合上笔记本盖子),Electron 应用也一定会暂停运行。

更直白地解释:

  • prevent-app-suspension 的含义是告诉操作系统:

    • “我这个应用目前正忙碌,需要保持活跃,请不要自动进入睡眠或休眠状态。”
  • 并不是电脑进入睡眠后,应用还能继续运行。

实践举例:

  • 生效情况

    • 电脑超过设定的空闲时间后,本来应该自动睡眠。但 Electron 的 prevent-app-suspension 会阻止此过程,系统继续保持清醒状态。
  • 不生效情况

    • 用户手动选择“睡眠”或按下电源按钮、合上盖子时,系统仍然会进入睡眠,Electron 无法阻止。

结论:

  • Electron 只能阻止系统 自动 睡眠或休眠,不能阻止 用户主动 睡眠。
  • 一旦系统真的进入睡眠或休眠,Electron 应用一定会暂停运行。

electron powerMonitor 可以知道是休眠还是睡眠吗

Electron 的内置 powerMonitor API 并不会直接区分系统究竟进入了『睡眠(sleep)』还是『休眠(hibernate)』状态。

Electron 中 powerMonitor 常用的事件:

  • suspend

    • 系统将要进入睡眠或者休眠状态时触发。
    • 但无法区分是睡眠还是休眠,仅表示系统将被挂起。
  • resume

    • 系统从睡眠或休眠状态唤醒时触发。
    • 同样不会明确告诉你是从睡眠还是休眠中恢复。

示例代码:

javascript
const { powerMonitor } = require("electron");

powerMonitor.on("suspend", () => {
  console.log("系统将要进入睡眠或休眠状态");
});

powerMonitor.on("resume", () => {
  console.log("系统已恢复");
});

⚙️ 如何区分睡眠和休眠?

Electron 本身不区分睡眠或休眠,如果你有这种需求,你可能需要额外的原生模块,或者直接通过调用系统的底层 API(比如 Windows API)来判断:

  • 在 Windows 上可以用命令行工具或系统 API 来判断事件记录,以确定具体进入的是睡眠还是休眠。
  • 但 Electron 原生的跨平台 API 并未提供如此详细的区别。

总结

问题Electron 内置 powerMonitor 能否实现
检测系统进入睡眠或休眠状态?✔️ 可以,但无法区分类型
区分『睡眠』和『休眠』?❌ 不可以

Electron 内置的 powerMonitor 提供的是更高层的跨平台抽象,满足多数场景,但如果需要更精细控制或监测,需要结合操作系统底层 API 来实现。