效能優化 螢幕常亮與CPU喚醒

2022-07-26 16:27:15 字數 3885 閱讀 9023

android在不使用的時候,螢幕在一段時間以後會變暗,再過一段時間就會熄屏,此時cpu就會休眠,那麼在這個時候,timer、handler、thread、service等都會暫停,有時候我們需要螢幕常亮,有時候需要熄屏後cpu仍然運作,那麼這就是本文記錄的主題

最好的方式是在activity中使用flag_keep_screen_on的flag

public

class

mainactivity

extends

activity

}

xmlns:android

=""android:layout_width

="match_parent"

android:layout_height

="match_parent"

android:keepscreenon

="true"

>

...relativelayout

>

android:keepscreenon = "true"的作用和flag_keep_screen_on一樣。使用**的好處是你允許你在需要的地方關閉螢幕

注意:一般不需要人為的去掉flag_keep_screen_on的flag,windowmanager會管理好程式進入後台回到前台的的操作。如果確實需要手動清掉常亮的flag,使用getwindow().clearflags(windowmanager.layoutparams.flag_keep_screen_on)

需要使用powermanager這個系統服務的喚醒鎖(wake locks)特徵來保持cpu處於喚醒狀態。喚醒鎖允許程式控制宿主裝置的電量狀態。建立和持有喚醒鎖對電池的續航有較大的影響,所以,除非是真的需要喚醒鎖完成盡可能短的時間在後台完成的任務時才使用它。比如在acitivity中就沒必要用了。如果需要關閉螢幕,使用上述的flag_keep_screen_on

只有一種合理的使用場景,是在使用後台服務在螢幕關閉情況下hold住cpu完成一些工作。 要使用喚醒鎖,如果不使用喚醒鎖來執行後台服務,不能保證因cpu休眠未來的某個時刻任務會停止,這不是我們想要的 (有的人可能認為我以前寫的後台服務就沒掉過鍊子呀執行得挺好的,1.可能是你的任務時間比較短;2.可能cpu被手機裡面很多其他的軟體一直在喚醒狀態)

喚醒鎖可劃分為並識別四種使用者喚醒鎖

標記值

cpu

螢幕

鍵盤

partial_wake_lock

開啟關閉

關閉screen_dim_wake_lock

開啟變暗

關閉screen_bright_wake_lock

開啟變亮

關閉full_wake_lock

開啟變亮

變亮自api等級17開始,full_wake_lock將被棄用。 應用應使用flag_keep_screen_on

第一步就是新增喚醒鎖許可權:

android:name

="android.permission.wake_lock"

/>

powermanager powermanager =

(powermanager)

getsystemservice

(power_service)

;wakelock wakelock = powermanager.

newwakelock

(powermanager.partial_wake_lock,

"mywakelocktag");

wakelock.

acquire()

;

注意:在使用該類的時候,必須保證acquirerelease是成對出現的

android:name

=".mywakefulreceiver"

/>

使用startwakefulservice()方法來啟動服務,與startservice()相比,在啟動服務的同時,並啟用了喚醒鎖

public

class

mywakefulreceiver

extends

wakefulbroadcastreceiver

}

當後台服務的任務完成,要呼叫mywakefulreceiver.completewakefulintent()來釋放喚醒鎖

public

class

myintentservice

extends

intentservice

@override

protected

void

onhandleintent

(intent intent)

}

採用定時重複的service開啟

intent intent =

newintent

(mcontext, servicetest.

class);

pendingintent pi = pendingintent.

getservice

(mcontext,

1, intent,0)

;alarmmanager alarm =

(alarmmanager)

getsystemservice

(service.alarm_service);if

(alarm != null)

android為了確保應用程式中關鍵**的正確執行,提供了wake lock的api,使得應用程式有許可權通過**阻止ap進入休眠狀態。但如果不領會android設計者的意圖而濫用wake lock api,為了自身程式在後台的正常工作而長時間阻止ap進入休眠狀態,就會成為待機電池殺手。比如前段時間的某應用,比如現在仍然幹著這事的某應用

那麼wake lock api有啥用呢?比如心跳包從請求到應答,比如斷線重連重新登陸這些關鍵邏輯的執行過程,就需要wake lock來保護。而一旦乙個關鍵邏輯執行成功,就應該立即釋放掉wake lock了。兩次心跳請求間隔5到10分鐘,基本不會怎麼耗電。除非網路不穩定,頻繁斷線重連,那種情況辦法不多

alarmmanagerandroid系統封裝的用於管理rtc的模組,rtc(real time clock)是乙個獨立的硬體時鐘,可以在cpu休眠時正常執行,在預設的時間到達時,通過中斷喚醒cpu(極光推送就是利用這個來做的)

1.關鍵邏輯的執行過程,就需要wake lock來保護。如斷線重連重新登陸

2.休眠的情況下如何喚醒來執行任務?用alarmmanager。如推送訊息的獲取

注:如果請求網路很差,會要很長的時間,一般我們谷歌建議一定要設定請求超時時間

android 螢幕常亮

今個發現乙個新的方式,使螢幕常亮竟然如此簡單 傳統的方式 亮 getwindow addflags windowmanager.layoutparams.flag keep screen on 滅 getwindow clearflags windowmanager.layoutparams.fla...

保持螢幕常亮

保持螢幕常亮方式一 public class textactivity extends activity sdk文件關於flag keep screen on的解釋如下 flag keep screen on added in api level 1 int flag keep screen on ...

Android保持螢幕常亮

方法一 新增許可權 powermanager pm powermanager getsystemservice context.power service powermanager.wakelock mwakelock pm.newwakelock powermanager.screen dim w...