溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Electron電源狀態(tài)管理的方法是什么

發(fā)布時(shí)間:2023-03-10 10:27:37 來(lái)源:億速云 閱讀:119 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“Electron電源狀態(tài)管理的方法是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Electron電源狀態(tài)管理的方法是什么”文章吧。

    Electron 電源相關(guān)模塊

    在 Electron 中有兩個(gè)模塊是跟電源相關(guān)的:

    • powerMonitor:用于獲取電源相關(guān)信息,監(jiān)聽(tīng)電源相關(guān)事件

    • powerSaveBlocker:用于阻止系統(tǒng)進(jìn)入睡眠狀態(tài)

    其中 powerMonitor 模塊提供的接口

    Electron電源狀態(tài)管理的方法是什么

    powerSaveBlocker 模塊提供的方法

    Electron電源狀態(tài)管理的方法是什么

    接下來(lái)詳細(xì)介紹它們提供的能力,以及具體的應(yīng)用場(chǎng)景:

    空閑狀態(tài)監(jiān)控

    getSystemIdleTime 方法可以獲取當(dāng)前用戶的空閑時(shí)間,如果用戶一直沒(méi)有對(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)

    如果一直沒(méi)有操作,會(huì)每隔三秒打?。?/p>

    3
    6
    9
    12
    15
    18

    如果中間用戶做了任何操作,例如:

    • 點(diǎn)擊鼠標(biāo)

    • 滑動(dòng)頁(yè)面

    • 按下鍵盤(pán)

    • 碰觸摸板

    • 碰 TouchBar

    • ……

    那么系統(tǒng)會(huì)判定用戶非空閑,然后將定時(shí)器重置,從零重新開(kāi)始計(jì)時(shí)。與之相關(guān)的還有一個(gè) API 是 getSystemIdleState(idleThreshold: number),可以通過(guò)傳遞一個(gè)時(shí)間閾值來(lái)判斷用戶的狀態(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 方法來(lái)判斷是否使用電池供電,其實(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īng)到用戶電腦的鎖屏和解鎖狀態(tài),這個(gè) API 可以幫助我們做性能優(yōu)化,例如頁(yè)面中有個(gè)輪播圖,每隔 5 秒就做一次輪播動(dòng)畫(huà)切換,消耗性能,如果此時(shí)用戶都已經(jīng)鎖屏了,其實(shí)就沒(méi)有必要再繼續(xù)輪播了,可以用下面的代碼通知渲染進(jìn)程:

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

    而在渲染進(jìn)程的代碼里可以這樣寫(xiě):

    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)到系統(tǒng)休眠和喚醒事件,對(duì)應(yīng)的 API 是:

    powerMonitor.on('suspend', () => {
      console.log('系統(tǒng)休眠')
    })
    powerMonitor.on('resume', () => {
      console.log('休眠喚醒')
    })

    想要觸發(fā)這個(gè) API 的話,可以點(diǎn)擊左上角的蘋(píng)果 icon,在下拉菜單里面選擇睡眠即可:

    Electron電源狀態(tài)管理的方法是什么

    如果同時(shí)監(jiān)聽(tīng)了鎖屏和解鎖,這些事件會(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í)第二次的順序是符合直覺(jué)的,首先是「休眠」觸發(fā)了「鎖屏」,然后「休眠喚醒」觸發(fā)了「屏幕解鎖」。

    系統(tǒng)行為阻斷

    在 Mac 和 Linux 平臺(tái)下,powerMonitor 提供了 shutdown 事件來(lái)監(jiān)聽(tīng)關(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í)間來(lái)做一些清理工作,當(dāng)清理工作完成之后,要盡快調(diào)用 app.quit()來(lái)退出程序。

    操作系統(tǒng)在長(zhǎng)時(shí)間沒(méi)有收到用戶操作事件后,會(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 才生效。

    以上就是關(guān)于“Electron電源狀態(tài)管理的方法是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI