Android PowerManager(電源服務(wù))

2023-03-31 14:24 更新

本節(jié)引言:

本節(jié)要講解的是Android為我們提供的系統(tǒng)服務(wù)中的——PowerManager(電源服務(wù)),用于 管理CPU運(yùn)行,鍵盤或屏幕亮起來;不過,除非迫不得已,否則進(jìn)來別去使用這個(gè)類,假如 你使用以后,一定要及時(shí)釋放!本節(jié)并不會(huì)太深入滴去講解這B,因?yàn)檫@涉及到底層的一些 東西,以后需要用到在深入研究~本節(jié)主要介紹的是一些基本的概念,PowerManager,wakelock 鎖的機(jī)制等!

官方API文檔:PowerManager


1.PowerManager是什么


Android系統(tǒng)為我們提供的電源管理的一個(gè)API,其相關(guān)接口與設(shè)備電池的續(xù)航能力有很大的關(guān)聯(lián), 官方也說了,除非是迫不得已吧,不然的話,應(yīng)該盡量避免使用這個(gè)類,并且使用完以后一定要及時(shí)釋放!

所謂的電源管理包括:CPU運(yùn)行,鍵盤或者屏幕亮起來!核心其實(shí)就是wakelock鎖機(jī)制,只要我們拿著這個(gè)鎖, 那么系統(tǒng)就無法進(jìn)入休眠狀態(tài),可以給用戶態(tài)程序或內(nèi)核獲取到!鎖可以是:"有超時(shí)的"或者 "沒有超時(shí)",超時(shí)的鎖到時(shí)間后會(huì)自動(dòng)解鎖,如果沒有了鎖或超時(shí),內(nèi)核會(huì)啟動(dòng)休眠機(jī)制來進(jìn)入休眠!


2.wakelock鎖介紹


PowerManager.WakeLock加鎖解鎖兩種狀態(tài),而加鎖的形式有兩種:

永久鎖住,這種鎖除非顯式的放開,否則是不會(huì)解鎖的,所以用起來需要非常小心!

超時(shí)鎖,到時(shí)間后就會(huì)解鎖,而創(chuàng)建WakeLock后,有兩種加鎖機(jī)制①不計(jì)數(shù)鎖機(jī)制②計(jì)數(shù)鎖機(jī)制(默認(rèn))可通過setReferenceCounted(boolean value)來指定,區(qū)別在于: 前者無論acquire( )多少次,一次release( )就可以解開鎖。 而后者則需要(--count == 0)的時(shí)候,同樣當(dāng)(count == 0)才會(huì)去申請(qǐng)鎖 所以,WakeLock的計(jì)數(shù)機(jī)制并不是正真意義上對(duì)每次請(qǐng)求進(jìn)行申請(qǐng)/釋放一個(gè)鎖; 只是對(duì)同一把鎖被申請(qǐng)/釋放的次數(shù)來進(jìn)行統(tǒng)計(jì),然后再去操作!

ps:關(guān)于更加深入的內(nèi)容就涉及到底層的內(nèi)容了,筆者水平有限,還沒到那個(gè)level, 這里就不深入研究了,就說一些基本的吧,以后有需要的話,再另開一篇吧~


3.PowerManager怎么用


PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock w1 = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyTag");
w1.acquire();
//在這個(gè)過程,屏幕會(huì)保持光亮!
w1.release();

上述newWakeLock( )的第一個(gè)flag標(biāo)記,這些標(biāo)記不同程度的影響系統(tǒng)電源.

這些標(biāo)記都是獨(dú)占的,并且每次只能指定其中一個(gè)。

PARTIAL_WAKE_LOCK:保持CPU 運(yùn)轉(zhuǎn),屏幕和鍵盤燈有可能是關(guān)閉的。

SCREEN_DIM_WAKE_LOCK:保持CPU 運(yùn)轉(zhuǎn),允許保持屏幕顯示但有可能是灰的,允許關(guān)閉鍵盤燈

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運(yùn)轉(zhuǎn),允許保持屏幕高亮顯示,允許關(guān)閉鍵盤燈

FULL_WAKE_LOCK:保持CPU 運(yùn)轉(zhuǎn),保持屏幕高亮顯示,鍵盤燈也保持亮度

ps:如果你使用的是局部喚醒鎖的話(使用PARTIAL_WAKE_LOCK標(biāo)志),CPU會(huì)繼續(xù)運(yùn)行, 將忽略任何的計(jì)時(shí)器,甚至按下電源按鈕。其他的喚醒鎖話,CPU也會(huì)繼續(xù)運(yùn)轉(zhuǎn),但是使用者仍 然可以按電源按鈕讓設(shè)備睡眠。另外,你可以使用兩個(gè)以上的標(biāo)記,但是他只影響屏幕的行為。 和 PARTIAL_WAKE_LOCK 同時(shí)使用的話,沒有任何影響。

屏幕解鎖參數(shù):

ACQUIRE_CAUSES_WAKEUP:正常喚醒鎖實(shí)際上并不打開照明。相反,一旦打開他們會(huì)一直仍然 保持(例如來世user的activity)。當(dāng)獲得wakelock,這個(gè)標(biāo)志會(huì)使屏幕或/和鍵盤立即打開。

一個(gè)典型的使用就是可以立即看到那些對(duì)用戶重要的通知。

ON_AFTER_RELEASE:設(shè)置了這個(gè)標(biāo)志,當(dāng)wakelock釋放時(shí)用戶activity計(jì)時(shí)器會(huì)被重置,導(dǎo)致照明 持續(xù)一段時(shí)間。如果你在wacklock條件中循環(huán),這個(gè)可以用來降低閃爍


4.需要的權(quán)限


要進(jìn)行電源的操作需要在AndroidManifest.xml中聲明該應(yīng)用有設(shè)置電源管理的權(quán)限:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

你可能還需要:

<uses-permission android:name="android.permission.DEVICE_POWER"/>

另外WakeLock的設(shè)置是Activity級(jí)別的,而不是針對(duì)整個(gè)Application應(yīng)用的!


本節(jié)小結(jié):

好的,本節(jié)介紹了PowerManager(電源服務(wù)),不過僅僅是科普一下而已,內(nèi)容也說了 不到迫不得已盡量別使用這個(gè)類~看懂了,或者沒看懂都沒關(guān)系,知道下即可!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)