版權(quán)聲明:
本賬號(hào)發(fā)布文章均來自公眾號(hào),承香墨影(cxmyDev),版權(quán)歸承香墨影所有。
未經(jīng)允許,不得轉(zhuǎn)載。
一、前言
在實(shí)際開發(fā)的過程中,會(huì)有一些需要保持屏幕常亮,避免進(jìn)入鎖屏狀態(tài)的需求。最常見的就是視頻播放的過程中,如果屏幕突然暗了,或者直接鎖屏,會(huì)非常的影響用戶的體驗(yàn)。
本篇文章就對(duì) Android 下,如何保持屏幕常量,做一個(gè)簡(jiǎn)單的記錄和總結(jié)。
二、幾種常見的方法
1、WakeLock
使用 WakeLock 是一種教科書式的比較常規(guī)的手段,使用起來也非常的簡(jiǎn)單。
可以看到,WakeLock 主要是通過 PowerManager 獲取,然后通過
acquire() 方法獲取一個(gè) WakeLock 資源,WakeLock 也是一種資源,在使用完成之后,別忘了調(diào)用 release() 方法進(jìn)行釋放。
使用 WakeLock 還需要額外的聲明 WAKE_LOCK 權(quán)限。
<uses-permission android:name="android.permission.WAKE_LOCK" />
當(dāng)然,使用 WakeLock 暫時(shí)來看,應(yīng)該還是沒有什么問題的。但是實(shí)際上,所有和屏幕亮度相關(guān)的 WakeLock 的 Flag ,在 API level 17+ 之上,都已經(jīng)被標(biāo)記廢棄了??梢钥闯?Android 在節(jié)能上做了很多努力,屏幕是費(fèi)電大戶,既然已經(jīng)被廢棄掉了,正常來說,我們還是不推薦使用的。
更多和 PowerManager.WakeLock 相關(guān)的內(nèi)容,可以看看之前的一篇文章《PowerManager 不是只有 WakeLock 》。
2、FLAG_KEEP_SCREEN_ON
前面說了,WakeLock 已經(jīng)被標(biāo)記廢棄。雖然被廢棄了,但是實(shí)際上 Android 還是給我們提供了對(duì)應(yīng)的解決方案的,那就是使用 FLAG_KEEP_SCREEN_ON 的方式來標(biāo)記屏幕常亮。
FLAG_KEEP_SCREEN_ON 使用起來也非常的簡(jiǎn)單,它是一個(gè)頁(yè)面 Window 上的一個(gè) Flag ,使用 addFlags() 方法添加。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
當(dāng)然,這里使用完成之后,也是需要取消掉的。取消這個(gè) Flag 使用 clearFlags() 方法來取消。
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
通常我們會(huì)在一個(gè) Activity 的 onResume() 和 onPause() 方法中,分別調(diào)用這兩個(gè)方法。
看看 FLAG_KEEP_SCREEN_ON 的文檔解釋。
從這里可以看出來,它只作用在一個(gè)被顯示的 Window 上,并且保持設(shè)備屏幕高亮度的常亮。
其實(shí)這里也可以看出來,官方廢棄 WakeLock 而推薦使用 FLAG_KEEP_SCREEN_ON ,一部分原因在于 WakeLock 是一個(gè)全局的資源,而 FLAG_KEEP_SCREEN_ON 只是一個(gè)和 window 相關(guān)的資源,作用范圍更小了一些。并且它比 WakeLock 更好的一點(diǎn)在于,它不需要額外的申請(qǐng)權(quán)限,一般來說,我們還是推薦使用它的。
3、keepScreenOn
除了給 Window 添加一個(gè) FLAG_KEEP_SCREEN_ON 的 Flag 之外,還可以對(duì)當(dāng)前可見的 View 調(diào)用 keepScreenOn() 方法來設(shè)置屏幕常亮。
keepScreenOn() 是 View 對(duì)象上的方法,同時(shí)也提供了布局中的屬性 android:keepScreenOn 來方便我們?cè)诓季种袑?duì)其進(jìn)行設(shè)置。
需要注意的一點(diǎn),使用 keepScreenOn() 設(shè)置的常亮標(biāo)識(shí),需要當(dāng)前 View 保持屏幕可見才行。所以一般而言,我們會(huì)在頁(yè)面的根布局中,添加此屬性。
通過文檔可以看到,實(shí)際上它的原理和 FLAG_KEEP_SCREEN_ON 一樣的,只是它更簡(jiǎn)單,只需要對(duì)某個(gè) View 設(shè)置,如果該 View 可見即生效,否者就不生效。
4、MediaPlayer的 setScreenOnWhilePlaying()
如果我們是使用一個(gè) MediaPlayer 來進(jìn)行視頻播放的話,MediaPlayer 還提供了 setScreenOnWhilePlaying() 方法,來設(shè)置屏幕常量。
其實(shí)沒什么好說的,繼續(xù)查看源碼可以看到其實(shí)最終調(diào)用的還是 keepScreenOn() 方法。當(dāng)然多了解一種方法也沒有什么壞處。
三、小結(jié)
保持屏幕常亮的方式有很多,選用我們需要的即可。當(dāng)然,最好還是不要使用 WakeLock 了,比較已經(jīng)被標(biāo)記為廢棄了。