一文詳解Electron 電源狀態(tài)管理
Electron 電源相關(guān)模塊
在 Electron 中有兩個(gè)模塊是跟電源相關(guān)的:
- powerMonitor:用于獲取電源相關(guān)信息,監(jiān)聽電源相關(guān)事件
- powerSaveBlocker:用于阻止系統(tǒng)進(jìn)入睡眠狀態(tài)
其中 powerMonitor 模塊提供的接口
powerSaveBlocker 模塊提供的方法
接下來詳細(xì)介紹它們提供的能力,以及具體的應(yīng)用場(chǎng)景:
空閑狀態(tài)監(jiān)控
getSystemIdleTime
方法可以獲取當(dāng)前用戶的空閑時(shí)間,如果用戶一直沒有對(duì)電腦做任何操作,系統(tǒng)會(huì)認(rèn)為當(dāng)前用戶處于空閑狀態(tài),并進(jìn)行計(jì)時(shí),這個(gè) API 可以返回以秒為單位的空閑時(shí)間。示例代碼如下:
const { powerMonitor } = require('electron') setInterval(() => { console.log(powerMonitor.getSystemIdleTime()) }, 3000)
如果一直沒有操作,會(huì)每隔三秒打?。?/p>
3
6
9
12
15
18
如果中間用戶做了任何操作,例如:
- 點(diǎn)擊鼠標(biāo)
- 滑動(dòng)頁面
- 按下鍵盤
- 碰觸摸板
- 碰 TouchBar
- ……
那么系統(tǒng)會(huì)判定用戶非空閑,然后將定時(shí)器重置,從零重新開始計(jì)時(shí)。與之相關(guān)的還有一個(gè) API 是 getSystemIdleState(idleThreshold: number)
,可以通過傳遞一個(gè)時(shí)間閾值來判斷用戶的狀態(tài),有四種可能的值:
active
:用戶處于活動(dòng)狀態(tài)idle
:用戶處于空閑狀態(tài)locked
:系統(tǒng)鎖屏了unknown
:未知狀態(tài)
電源狀態(tài)監(jiān)控
當(dāng)電腦接入電源的時(shí)候,會(huì)觸發(fā) on-ac
事件,當(dāng)拔掉電源,電池變成放電狀態(tài)時(shí),會(huì)觸發(fā) on-battery
事件。除了這兩個(gè)事件之外,powerMonitor 還分別提供了一個(gè) onBatteryPower
屬性和一個(gè) isOnBatteryPower
方法來判斷是否使用電池供電,其實(shí)這兩個(gè)東西是一樣的,從 Electron 源碼 lib/browser/api/power-monitor.ts
中可以看到僅僅是做了一個(gè) 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(); } }
鎖屏和解鎖
主進(jìn)程可以監(jiān)聽到用戶電腦的鎖屏和解鎖狀態(tài),這個(gè) API 可以幫助我們做性能優(yōu)化,例如頁面中有個(gè)輪播圖,每隔 5 秒就做一次輪播動(dòng)畫切換,消耗性能,如果此時(shí)用戶都已經(jīng)鎖屏了,其實(shí)就沒有必要再繼續(xù)輪播了,可以用下面的代碼通知渲染進(jìn)程:
powerMonitor.on('lock-screen', () => { win.webContents.send('lock-screen') }) powerMonitor.on('unlock-screen', () => { win.webContents.send('unlock-screen') })
而在渲染進(jìn)程的代碼里可以這樣寫:
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> ) }
這樣就實(shí)現(xiàn)了:用戶鎖屏后不進(jìn)行輪播,用戶解鎖后恢復(fù)輪播的效果。
休眠和喚醒
powerMonitor 模塊也可以監(jiān)聽到系統(tǒng)休眠和喚醒事件,對(duì)應(yīng)的 API 是:
powerMonitor.on('suspend', () => { console.log('系統(tǒng)休眠') }) powerMonitor.on('resume', () => { console.log('休眠喚醒') })
想要觸發(fā)這個(gè) API 的話,可以點(diǎn)擊左上角的蘋果 icon,在下拉菜單里面選擇睡眠即可:
如果同時(shí)監(jiān)聽了鎖屏和解鎖,這些事件會(huì)同時(shí)觸發(fā),但是回調(diào)的順序是不一定的,實(shí)際測(cè)試的時(shí)候發(fā)現(xiàn)下面兩種情況都可能發(fā)生:
suspend resume lock-screen unlock-screen suspend lock-screen resume unlock-screen
其實(shí)第二次的順序是符合直覺的,首先是「休眠」觸發(fā)了「鎖屏」,然后「休眠喚醒」觸發(fā)了「屏幕解鎖」。
系統(tǒng)行為阻斷
在 Mac 和 Linux 平臺(tái)下,powerMonitor 提供了 shutdown
事件來監(jiān)聽關(guān)機(jī)事件:
powerMonitor.on('shutdown', (e) => { e.preventDefault() })
如果在事件回調(diào)里面調(diào)用了 preventDefault
方法,其實(shí)是不能阻止系統(tǒng)關(guān)機(jī)的,但是可以延緩關(guān)機(jī)行為,從而讓當(dāng)前應(yīng)用有足夠的時(shí)間來做一些清理工作,當(dāng)清理工作完成之后,要盡快調(diào)用 app.quit()
來退出程序。
操作系統(tǒng)在長(zhǎng)時(shí)間沒有收到用戶操作事件后,會(huì)進(jìn)入省電模式,顯示器會(huì)被自動(dòng)關(guān)閉,Electron 的 powerSaveBlocker
模塊可以阻止系統(tǒng)進(jìn)入睡眠模式,讓操作系統(tǒng)和屏幕持續(xù)工作。示例代碼如下:
const { powerSaveBlocker } = require('electron') // 阻止系統(tǒng)自動(dòng)進(jìn)入休眠狀態(tài) const id = powerSaveBlocker.start('prevent-display-sleep') // 指定 id 的 powerSaveBlocker 是否啟動(dòng) console.log(powerSaveBlocker.isStarted(id)) setTimeout(()=>{ // 停止阻止行為 powerSaveBlocker.stop(id) console.log(powerSaveBlocker.isStarted(id)) }, 5000)
powerSaveBlocker
是一個(gè)獨(dú)立的模塊,它只提供了三個(gè)方法:
start
:阻止休眠stop
:停止阻止行為isStart
:查詢阻止行為是否處于啟用狀態(tài)
其中start
方法需要傳一個(gè)參數(shù),有兩個(gè)可選的值:
prevent-app-suspension
:保持系統(tǒng)活躍,但屏幕可以不亮prevent-display-sleep
:保持系統(tǒng)和屏幕活躍,屏幕要一直亮
舉個(gè)例子,如果應(yīng)用持續(xù)播放音頻,可以用 prevent-app-suspension
,音頻不需要屏幕常亮,如果應(yīng)用持續(xù)播放視頻或者PPT,就需要用 prevent-display-sleep
了,它們可以被同時(shí)調(diào)用,后者的優(yōu)先級(jí)是高于前者的:
例如 A 調(diào)用了 prevent-app-suspension
,B 調(diào)用了 prevent-display-sleep
,那么 prevent-display-sleep
將生效,當(dāng) B 停止后 prevent-app-suspension
才生效。
以上就是一文詳解Electron 電源狀態(tài)管理的詳細(xì)內(nèi)容,更多關(guān)于Electron 電源狀態(tài)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之?dāng)?shù)組、棧與隊(duì)列
這篇文章主要給大家介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組、棧與隊(duì)列的相關(guān)資料,文中對(duì)數(shù)組、棧與隊(duì)列的使用方法進(jìn)行了詳細(xì)的總結(jié),相信對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05JavaScript設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例分析
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之責(zé)任鏈模式,結(jié)合實(shí)例形式分析了責(zé)任鏈模式的概念、原理及具體定義與使用技巧,需要的朋友可以參考下2019-01-01使用JS實(shí)現(xiàn)圖片輪播的實(shí)例(前后首尾相接)
下面小編就為大家?guī)硪黄褂肑S實(shí)現(xiàn)圖片輪播的實(shí)例(前后首尾相接)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09jQuery animate()實(shí)現(xiàn)背景色漸變效果的處理方法【使用jQuery.color.js插件】
這篇文章主要介紹了jQuery animate()實(shí)現(xiàn)背景色漸變效果的處理方法,結(jié)合實(shí)例形式分析了jQuery顏色插件jquery.color.js實(shí)現(xiàn)背景色漸變的簡(jiǎn)單操作技巧,需要的朋友可以參考下2017-03-03javascript編程實(shí)現(xiàn)棧的方法詳解【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】
這篇文章主要介紹了javascript編程實(shí)現(xiàn)棧的方法,簡(jiǎn)單說明了棧的概念、特點(diǎn)并結(jié)合實(shí)例形式分析了javascript棧的定義、入棧、出棧等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04