Android Manager之PowerManager(電源服務)

Penny-聽海發表於2018-04-27

簡介:

Android系統為我們提供的電源管理的一個API,其相關介面與裝置電池的續航能力有很大的關聯, 官方也說了,除非是迫不得已吧,不然的話,應該儘量避免使用這個類,並且使用完以後一定要及時釋放。所謂的電源管理包括:CPU執行,鍵盤或者螢幕亮起來!核心其實就是wakelock鎖機制,只要我們拿著這個鎖, 那麼系統就無法進入休眠狀態,可以給使用者態程式或核心獲取到。鎖可以是:”有超時的“或者 “沒有超時“,超時的鎖到時間後會自動解鎖,如果沒有了鎖或超時,核心會啟動休眠機制來進入休眠。


PowerManager.WakeLock有加鎖與解鎖兩種狀態,而加鎖的形式有兩種: 

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

②超時鎖,到時間後就會解鎖,而建立WakeLock後,有兩種加鎖機制:

①不計數鎖機制,②計數鎖機制(預設) 

可通過setReferenceCounted(boolean value)來指定,區別在於: 

前者無論acquire( )多少次,一次release( )就可以解開鎖。 

而後者則需要(–count == 0)的時候,同樣當(count == 0)才會去申請鎖 所以,WakeLock的計數機制並不是正真意義上對每次請求進行申請/釋放一個鎖; 只是對同一把鎖被申請/釋放的次數來進行統計,然後再去操作!


android系統在手機螢幕鎖定之後一般會讓手機休眠,以提高電池的使用時間。但是休眠意味著CPU頻率降低,有時候可能需要做一些需要大量運算的任務,所以需要喚醒CPU。WakeLock可以做到這一點。也就是說WakeLock主要用於操作螢幕問題。


使用


1.新增許可權

<!-- 允許應用在手機螢幕關閉後後臺程式仍然執行 -->

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

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


2.程式碼使用

2.1.獲取 WakeLock 物件

private PowerManager.WakeLock mWakeLock;

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());


2.2.WakeLock的等級


1.PARTIAL_WAKE_LOCK:保證CPU保持高效能執行,而螢幕和鍵盤背光(也可能是觸控按鍵的背光)關閉。一般情況下都會使用這個WakeLock。

2.ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高效能執行外還會導致螢幕亮起,即使螢幕原先處於關閉的狀態下。

3.ON_AFTER_RELEASE:如果釋放WakeLock的時候螢幕處於亮著的狀態,則在釋放WakeLock之後讓螢幕再保持亮一小會。如果釋放WakeLock的時候螢幕本身就沒亮,則不會有動作。


2.3.獲得WakeLock

mWakeLock.acquire();


2.4.釋放WakeLock

mWakeLock.release();


2.5.其他方法

boolean isHeld():

判斷是否已經獲取WakeLock



void setReferenceCounted(boolean value):

是否使用引用計數。類似於垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的話將啟用該特性,如果一個WakeLock acquire了多次也必須release多次才能釋放掉。但是如果釋放次數比acquire多則會丟擲RuntimeException("WakeLock under-locked " + mTag)異常。預設是開啟了引用計數的!


2.6.PowerManager的幾個實用方法


boolean PowerManager::isScreenOn ()判斷螢幕是否亮著(不管是暗的dimed還是正常亮度),在API20被棄用,推薦boolean PowerManager::isInteractive ()


void PowerManager::goToSleep(long time)time是時間戳,一般是System.currentTimeMillis()+timeDelay。強制系統立刻休眠,需要Manifest中新增許可權"android.permission.DEVICE_POWER"。按下電源鍵鎖屏時呼叫的就是這個方法。


void PowerManager::wakeUp(long time)與上面對應。引數含義,所需許可權與上同。按下電源鍵解鎖螢幕時呼叫的就是這個方法。


void PowerManager::reboot(String reason)重啟手機,reason是要傳給linux核心的引數,比如“recovery”重啟進recovery模式,“fastboot”重啟進fastboot模式。需要許可權"android.permission.REBOOT"。


附:

Android Manager之彙總


相關文章