一文详解Electron 电源状态管理

目录
  • Electron 电源相关模块
    • 其中 powerMonitor 模块提供的接口
    • powerSaveBlocker 模块提供的方法
  • 空闲状态监控
  • 电源状态监控
  • 锁屏和解锁
  • 休眠和唤醒
  • 系统行为阻断

Electron 电源相关模块

在 Electron 中有两个模块是跟电源相关的:

其中 powerMonitor 模块提供的接口

powerSaveBlocker 模块提供的方法

接下来详细介绍它们提供的能力,以及具体的应用场景:

空闲状态监控

getSystemIdleTime 方法可以获取当前用户的空闲时间,如果用户一直没有对电脑做任何操作,系统会认为当前用户处于空闲状态,并进行计时,这个 API 可以返回以秒为单位的空闲时间。示例代码如下:

const { powerMonitor } = require('electron')
setInterval(() => {
  console.log(powerMonitor.getSystemIdleTime())
}, 3000)

如果一直没有操作,会每隔三秒打印:

3
6
9
12
15
18

如果中间用户做了任何操作,例如:

  • 点击鼠标
  • 滑动页面
  • 按下键盘
  • 碰触摸板
  • 碰 TouchBar
  • ……

那么系统会判定用户非空闲,然后将定时器重置,从零重新开始计时。与之相关的还有一个 API 是 getSystemIdleState(idleThreshold: number),可以通过传递一个时间阈值来判断用户的状态,有四种可能的值:

  • active:用户处于活动状态
  • idle:用户处于空闲状态
  • locked:系统锁屏了
  • unknown:未知状态

电源状态监控

当电脑接入电源的时候,会触发 on-ac事件,当拔掉电源,电池变成放电状态时,会触发 on-battery事件。除了这两个事件之外,powerMonitor 还分别提供了一个 onBatteryPower 属性和一个 isOnBatteryPower 方法来判断是否使用电池供电,其实这两个东西是一样的,从 Electron 源码 lib/browser/api/power-monitor.ts 中可以看到仅仅是做了一个 getter 而已:

import { EventEmitter } from 'events';
import { app } from 'electron/main';
const {
  createPowerMonitor,
  getSystemIdleState,
  getSystemIdleTime,
  isOnBatteryPower
} = process._linkedBinding('electron_browser_power_monitor');
class PowerMonitor extends EventEmitter {
  // 省略部分代码...
  getSystemIdleState (idleThreshold: number) {
    return getSystemIdleState(idleThreshold);
  }
  getSystemIdleTime () {
    return getSystemIdleTime();
  }
  isOnBatteryPower () {
    return isOnBatteryPower();
  }
  get onBatteryPower () {
    return this.isOnBatteryPower();
  }
}

锁屏和解锁

主进程可以监听到用户电脑的锁屏和解锁状态,这个 API 可以帮助我们做性能优化,例如页面中有个轮播图,每隔 5 秒就做一次轮播动画切换,消耗性能,如果此时用户都已经锁屏了,其实就没有必要再继续轮播了,可以用下面的代码通知渲染进程:

powerMonitor.on('lock-screen', () => {
  win.webContents.send('lock-screen')
})
powerMonitor.on('unlock-screen', () => {
  win.webContents.send('unlock-screen')
})

而在渲染进程的代码里可以这样写:

function Banner() {
  const [autoplay, setAutoplay] = useState(true)
  useEffect(() => {
    const lockScreen = () => setAutoplay(false)
    const unlockScreen = () => setAutoplay(true)
    ipcRenderer.on('lock-screen', lockScreen)
    ipcRenderer.on('unlock-screen', unlockScreen)
    return () => {
      ipcRenderer.removeListener('lock-screen', lockScreen)
      ipcRenderer.removeListener('unlock-screen', unlockScreen)
    }
  }, [])
  return (
    <div className="banner-widget">
      <div className="carousel">
        <Slider
          autoplay={autoplay}
          autoplaySpeed={10000}
          arrows={false}
        >
        </Slider>
      </div>
    </div>
  )
}

这样就实现了:用户锁屏后不进行轮播,用户解锁后恢复轮播的效果。

休眠和唤醒

powerMonitor 模块也可以监听到系统休眠和唤醒事件,对应的 API 是:

powerMonitor.on('suspend', () => {
  console.log('系统休眠')
})
powerMonitor.on('resume', () => {
  console.log('休眠唤醒')
})

想要触发这个 API 的话,可以点击左上角的苹果 icon,在下拉菜单里面选择睡眠即可:

如果同时监听了锁屏和解锁,这些事件会同时触发,但是回调的顺序是不一定的,实际测试的时候发现下面两种情况都可能发生:

suspend
resume
lock-screen
unlock-screen
suspend
lock-screen
resume
unlock-screen

其实第二次的顺序是符合直觉的,首先是「休眠」触发了「锁屏」,然后「休眠唤醒」触发了「屏幕解锁」。

系统行为阻断

在 Mac 和 Linux 平台下,powerMonitor 提供了 shutdown 事件来监听关机事件:

powerMonitor.on('shutdown', (e) => {
  e.preventDefault()
})

如果在事件回调里面调用了 preventDefault方法,其实是不能阻止系统关机的,但是可以延缓关机行为,从而让当前应用有足够的时间来做一些清理工作,当清理工作完成之后,要尽快调用 app.quit()来退出程序。

操作系统在长时间没有收到用户操作事件后,会进入省电模式,显示器会被自动关闭,Electron 的 powerSaveBlocker 模块可以阻止系统进入睡眠模式,让操作系统和屏幕持续工作。示例代码如下:

const { powerSaveBlocker } = require('electron')
// 阻止系统自动进入休眠状态
const id = powerSaveBlocker.start('prevent-display-sleep')
// 指定 id 的 powerSaveBlocker 是否启动
console.log(powerSaveBlocker.isStarted(id))
setTimeout(()=>{
  // 停止阻止行为
  powerSaveBlocker.stop(id)
  console.log(powerSaveBlocker.isStarted(id))
}, 5000)

powerSaveBlocker是一个独立的模块,它只提供了三个方法:

  • start:阻止休眠
  • stop:停止阻止行为
  • isStart:查询阻止行为是否处于启用状态

其中start方法需要传一个参数,有两个可选的值:

  • prevent-app-suspension:保持系统活跃,但屏幕可以不亮
  • prevent-display-sleep:保持系统和屏幕活跃,屏幕要一直亮

举个例子,如果应用持续播放音频,可以用 prevent-app-suspension,音频不需要屏幕常亮,如果应用持续播放视频或者PPT,就需要用 prevent-display-sleep 了,它们可以被同时调用,后者的优先级是高于前者的:

例如 A 调用了 prevent-app-suspension,B 调用了 prevent-display-sleep,那么 prevent-display-sleep 将生效,当 B 停止后 prevent-app-suspension 才生效。

以上就是一文详解Electron 电源状态管理的详细内容,更多关于Electron 电源状态管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • electron打包中的巨坑解决记录

    目录 吐槽 问题一:css文件中图片加载失败 问题描述 解决过程 补充 问题二:无法使用cookie 问题描述 原因分析 总结 吐槽 从上周五到今天,我被electron打包折磨得死去活来,本来想让测试用桌面端的,现在不得不改用web端,真的好无语.今天解决问题顺利打包后来记录一下这个问题. 问题一:css文件中图片加载失败 问题描述 问题是这样的,electron打包为桌面端以后,登录页的表单是正常显示的,但是整个页面的背景图没了.我百度了一下,发现大多是说白屏啥的,但是我不是白屏啊,我的表单

  • Electron 网络拦截实战示例详解

    目录 正文 自定义 UA 绕过跨域限制 请求转发 正文 Electron 提供的 webRequest API,允许开发者对网络进行过滤和监听,并且可以修改 header 字段甚至请求地址,功能非常强大,它的类结构如下: 不过需要注意,该模块只能在主进程中使用,接下来为大家介绍 webRequest 三个非常典型的使用场景: 自定义 UA 有些接口为了过滤非法请求,会首先校验 UserAgent,正常的浏览器是无法伪造 UA 的,不过在 Electron 里面可以很容易做到,webRequest

  • electron渲染进程主进程相互传值示例解析

    目录 在electron中分为渲染进程和主进程 浏览器传值给主进程 浏览器环境 主进程 主进程传值给渲染进程 主进程 渲染进程 注意 在electron中分为渲染进程和主进程 渲染进程就是浏览器环境,主进程就是node环境 既然他们是不同的环境,那么为我们怎么让他们相互关联起来呢?或者说怎么传递值? 毕竟在开发中可能会遇到我想要的值只能在node环境中才能获取,然后node中可能也会需要浏览器环境的值:这个时候就需要两个环境联通起来相互传值 浏览器传值给主进程 浏览器环境 引入: import

  • electron 中 webview的使用示例解析

    目录 正文 获取webview的dom webview 页面 webview页面的代码 新建public/preload.js文件 监听页面对否显示 禁止打开新窗口 刷新页面 上一页 下一页 正文 webview 想必都有所了解,比如:微信小程序嵌套H5 那么我们在electron中怎么使用webview呢? 我们先跟着官方文档展示一下,看是否能有效果: 若要在应用程序中嵌入网页, 请将 webview 标签添加到应用程序的被嵌入页面中 (这是将显示外来内容的应用程序页). 在最简单的例子中,

  • Electron调用外接摄像头并拍照上传实现详解

    目录 背景 需求分析 实现 视频采集 MediaDevices.getUserMedia() 拍照生成图片 上传图片至CDN 1. 使用HTMLCanvasElement.toBlob() 语法 参数 2. 使用HTMLCanvasElement.toDataURL() 语法 参数 返回值 总结 背景 基于Electron实现的pc端智能验机应用,近期迭代了一个新的功能,需求是通过电脑外接摄像头对手机屏幕进行拍照,拍照后需将照片上传至服务端进行屏幕信息比对,确定被检测屏幕是否为原厂屏. 需求分析

  • Electron 剪贴板实现示例详解

    目录 正文 availableFormats readText 和 writeText readHTML 和 writeHTML readImage 和 writeImage readRTF 和 writeRTF clear 正文 在浏览器中可以通过 JavaScript 脚本来读写剪贴板数据,常用的是 document.execCommand 方法: // 复制数据 const inputElement = document.querySelector('#input') inputEleme

  • 一文详解Electron 电源状态管理

    目录 Electron 电源相关模块 其中 powerMonitor 模块提供的接口 powerSaveBlocker 模块提供的方法 空闲状态监控 电源状态监控 锁屏和解锁 休眠和唤醒 系统行为阻断 Electron 电源相关模块 在 Electron 中有两个模块是跟电源相关的: powerMonitor:用于获取电源相关信息,监听电源相关事件 powerSaveBlocker:用于阻止系统进入睡眠状态 其中 powerMonitor 模块提供的接口 powerSaveBlocker 模块提

  • 一文详解go mod依赖管理详情

    目录 1. go的依赖管理发展 2. go.mod 文件分析 3. go mod依赖下载工具 4. 可能出现的问题汇总 1. go的依赖管理发展 GOPATH 所有的依赖都放置在同一路径下,可以复用下载的依赖,但是当不同项目需要依赖不同版本的依赖时,就很容易出现冲突问题. govendor 解决了依赖库版本不一致的问题,但是不好控制(了解即可) go mod 使用go.mod文件管理以来的版本,通过go get下载依赖 2. go.mod 文件分析 module xx/xx/xx/v2 go 1

  • 详解Vue中状态管理Vuex

    vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试. 在vuex出现之前,vue里面的状态是属于'单向数据流'.举个官网的例子: new Vue({ // state data () { return { count: 0 } }, // view template: `<div>{{ count }} </div`, // actions methods: { increment () { this.count++ } } }) 其中 state

  • 详解HTTP Cookie状态管理机制

    HTTP cookies,通常又称作"cookies",已经存在了很长时间,但是仍旧没有被予以充分的理解.首要的问题是存在了诸多误区,认为cookies是后门程序或病毒,或压根不知道它是如何工作的.第二个问题是对于cookies缺少一个一致性的接口.尽管存在着这些问题,cookies仍旧在web开发中起着如此重要的作用,以至于如果cookie在没有可替代品出现的情况下消失,我们许多喜欢的Web应用将变得毫无用处. 一.cookie 起源 cookie 最早是网景公司的雇员 Lou Mo

  • 一文详解Pinia和Vuex与两个Vue状态管理模式

    目录 前言 安装 挂载 Vuex Pinia 修改状态 vuex Pinia Pinia解构(storeToRefs) getters Pinia Vuex modules Pinia Vuex 写在最后 前言 Pinia和Vuex一样都是是vue的全局状态管理器.其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia. 本文将通过Vue3的形式对两者的不同实现方式进行对比,让你在以后工作中无论使用到Pinia还是Vuex的时候都能够游刃有余. 既然我们要

  • 一文详解Java线程的6种状态与生命周期

    目录 1.线程状态(生命周期) 2.操作线程状态 2.1.新创建状态(NEW) 2.2.可运行状态(RUNNABLE) 2.3.被阻塞状态(BLOCKED) 2.4.等待唤醒状态(WAITING) 2.5.计时等待状态(TIMED_WAITING) 2.6.终止(TERMINATED) 3.查看线程的6种状态 1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态. 线程可以有如下6 种状态: New (新创建):未启动的线程: Runnable (可运行):可运行的线程,需要等待操作

  • 一文详解C++中动态内存管理

    目录 前言 1.C/C++程序的内存开辟 2.C语言中动态内存管理方式:malloc/calloc/realloc/free 2.1malloc.calloc.realloc区别? 3.C++内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3new和malloc处理失败 4.operator new与operator delete函数 4.1 operator new与operator delete函数 4.1.1 我们看看operator

  • 一文详解Golang 定时任务库 gron 设计和原理

    目录 cron 简介 gron 定时参数 源码解析 Cron Entry 按照时间排序 新增定时任务 启动和停止 Schedule 扩展性 经典写法-控制退出 结语 cron 简介 在 Unix-like 操作系统中,有一个大家都很熟悉的 cli 工具,它能够来处理定时任务,周期性任务,这就是: cron. 你只需要简单的语法控制就能实现任意[定时]的语义.用法上可以参考一下这个Crontab Guru Editor,做的非常精巧. 简单说,每一个位都代表了一个时间维度,* 代表全集,所以,上面

  • 一文详解 Compose Navigation 的实现原理

    目录 前言 1. 从 Jetpack Navigation 说起 2. 定义导航 3. 导航跳转 4. 保存状态 SaveableStateHolder & rememberSaveable 导航回退时的状态保存 底部导航栏切换时的状态保存 5. 导航转场动画 6. Hilt & Navigation 7. 总结 前言 一个纯 Compose 项目少不了页面导航的支持,而 navigation-compose 几乎是这方面的唯一选择,这也使得它成为 Compose 工程的标配二方库.介绍 

  • 一文详解React Redux使用方法

    目录 一.理解JavaScript纯函数 1.1 纯函数的概念 1.2 副作用概念的理解 1.3 纯函数在函数式编程的重要性 二.Redux的核心思想 2.1 为什么需要 Redux 2.2 Redux的核心概念 2.2.1 store 2.2.2 action 2.2.3 reducer 2.3 Redux的三大原则 2.3.1 单一数据源 2.3.2 State是只读的 2.3.3 使用纯函数来执行修改 2.4 Redux 工作流程 三.Redux基本使用 3.1 创建Store的过程 3.

随机推荐