PowerManager 電源管理(電源使用管理)。主要管理設(shè)備啟動(dòng),保持活動(dòng),休眠,喚醒。其中為了保持任務(wù),提供了PowerManager.WakeLock(喚醒鎖)。執(zhí)行任務(wù)時(shí)持有這個(gè)喚醒鎖,就可以防止休眠,從而正常的完成任務(wù)。當(dāng)然,代價(jià)就是增加了耗電。 另一種情況,如果任務(wù)執(zhí)行后,沒有釋放該鎖,則設(shè)備不會(huì)進(jìn)入休眠,進(jìn)而更多的增加了耗電。實(shí)際上WakeLock是站立在耗電優(yōu)化的對(duì)立面的,但是又有很多場(chǎng)景不的不使用,例如在聽音樂,看視頻的過程中希望設(shè)備休眠么?

因此在很多場(chǎng)景必須考慮使用WakeLock,很多場(chǎng)景有沒有必要使用WakeLock。例如使用電子書進(jìn)行閱讀,就需要WakeLock防止滅屏;QQ微信,使用WakeLock保持后臺(tái)一直運(yùn)行,可以接收消息。

WakeLock 的使用:

1 添加使用權(quán)限

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

2 具體使用
 

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

//創(chuàng)建WakeLock,鎖類型是PowerManager.PARTIAL_WAKE_LOCK
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    PowerManager.WakeLock mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");    //獲取WakeLock
    if(mWakeLock != null){mWakeLock.acquire();}    //**********執(zhí)行任務(wù)*************//

   //釋放WakeLock,準(zhǔn)許設(shè)備進(jìn)入休眠
 if(mWakeLock != null && mWakeLock.isHeld()){mWakeLock.release();}

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

以上就是最簡(jiǎn)單的使用方式。最重要的是最有一句mWakeLock.release();一定要確保鎖釋放。否則耗電是猛烈的。

基于以上闡述,需要關(guān)注的優(yōu)化點(diǎn)如下:
1 使用恰當(dāng)?shù)逆i類型

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

PowerManager.PARTIAL_WAKE_LOCK 僅僅確保CPU運(yùn)行,至于屏幕是否常亮,鍵盤燈都不做保障。一般常用喚醒鎖
PowerManager.SCREEN_DIM_WAKE_LOCK 確保CPU運(yùn)行,以及屏幕保持灰色,鍵盤燈不作保障。
PowerManager.SCREEN_BRIGHT_WAKE_LOCK 確保CPU,屏幕常亮,且亮度最高,鍵盤燈不做保持。
PowerManager.FULL_WAKE_LOCK  確保CPU運(yùn)行,以及屏幕常亮,還有鍵盤燈常亮。
PowerManager.ACQUIRE_CAUSES_WAKEUP 確保CPU運(yùn)行,以及屏幕常亮,即便是原來屏幕是滅的也會(huì)被點(diǎn)亮,鍵盤燈不保持。 
     
    
PowerManager.SCREEN_DIM_WAKE_LOCK 強(qiáng)制打開屏幕和鍵盤燈。
PowerManager.ON_AFTER_RELEASE 該鎖釋放后,會(huì)持續(xù)保持屏幕狀態(tài)一段年時(shí)間。
PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE 和距離傳感器一起使用,當(dāng)通話時(shí),手接近屏幕時(shí)滅屏,離開屏幕時(shí)亮屏

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

2 適當(dāng)?shù)奶幚沓宙i時(shí)間
 有時(shí)候不能確定持鎖期間任務(wù)執(zhí)行需要多長時(shí)間。例如訪問網(wǎng)絡(luò)是可能會(huì)超時(shí),導(dǎo)致程序無法執(zhí)行下去,進(jìn)一步無法釋放鎖?;诖嗽诔宙i是需要做一個(gè)超時(shí)限制,超過了定時(shí)自然釋放鎖。

if(mWakeLock != null){mWakeLock.acquire(10000);//持鎖1秒后釋放}

3 持鎖時(shí)間越短越好。
 
此外PowerManager還提供了以下接口

1 gotoSleep() 強(qiáng)行進(jìn)入休眠
2  wakeup() 強(qiáng)行從休眠進(jìn)入喚醒
3 userActivity() 向PowerManagerService 報(bào)告影響系統(tǒng)休眠的用戶活動(dòng),重計(jì)算滅屏?xí)r間,背光亮度等,例如觸屏,劃屏,power鍵等用戶活動(dòng)。
以上三個(gè)方法不對(duì)上層apk開放,而且需要一下兩種權(quán)限

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

4  reboot(String reason);重啟,非app接口。添加權(quán)限android.permission.REBOOT。

 

其他保持亮屏方式,這些只是對(duì)屏幕耗電的調(diào)整,對(duì)當(dāng)前window有效

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //當(dāng)鎖屏是任然可以顯示該Window。

                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //當(dāng)Window對(duì)于用戶可見時(shí),則處于高亮

                | WindowManager.LayoutParams.FLAG_TRUE_SCREEN_ON); //當(dāng)使用Activity的時(shí)候能夠點(diǎn)亮屏幕

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

或者

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:keepScreenOn="true">

http://www.cnblogs.com/ouyanliu/p/7220265.html