版權(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é)筛严。
二醉旦、幾種常見的方法
1、WakeLock
使用 WakeLock 是一種教科書式的比較常規(guī)的手段桨啃,使用起來也非常的簡單车胡。
可以看到,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 使用起來也非常的簡單,它是一個(gè)頁面 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ì)在頁面的根布局中,添加此屬性潭枣。
通過文檔可以看到比默,實(shí)際上它的原理和 FLAG_KEEP_SCREEN_ON 一樣的,只是它更簡單盆犁,只需要對(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)記為廢棄了。