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 具體使用
//創(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();}
以上就是最簡(jiǎn)單的使用方式。最重要的是最有一句mWakeLock.release();一定要確保鎖釋放。否則耗電是猛烈的。
基于以上闡述,需要關(guān)注的優(yōu)化點(diǎn)如下:
1 使用恰當(dāng)?shù)逆i類型
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í)亮屏
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有效
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)亮屏幕
或者
<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