設(shè)備息屏?不存在的!保持 Android 常亮的幾種方法!
一、前言
在實際開發(fā)過程中,會有一些需要保持屏幕常亮的需求。如果不特殊設(shè)置,通常我們的手機在靜置一段時間之后,就會自動進入息屏狀態(tài),而我們要做的就是阻止它進入息屏狀態(tài)。
這個功能,使用場景要從實際情況出發(fā),例如:播放器,還有一些向智能電視投屏的手機 App ,都可能會有類似的需要。
本篇文章就對 Android 下,如何保持屏幕常亮,做一個簡單的記錄和總結(jié)。
二、幾種常見的方法
2.1 被廢棄的 WakeLock
如果你看過比較早的 Android 教程類的書籍的話,在說到保持屏幕常亮這個需求的時候,你應(yīng)該會想到 WakeLock??上绻悻F(xiàn)在還想只用 WakeLock 來限制屏幕常亮,你會發(fā)現(xiàn)已經(jīng)做不到了,不過作為一個教科書式的方法,雖然已經(jīng)被遺棄了,我們還是先來了解一下它。
WakeLock 使用起來也非常的簡單。
從上面的例子可以看到,WakeLock 主要是通過一個系統(tǒng)服務(wù) PowerManager,然后通過調(diào)用它的 acquire() 方法獲取一個 WakeLock 資源。
WakeLock 本身也是一種資源,在使用完成之后,別忘了調(diào)用 release() 方法進行釋放。
而使用 WakeLock 還需要額外的聲明 WAKE_LOCK 權(quán)限。
- <uses-permission android:name="android.permission.WAKE_LOCK" />
前面使用 newWakeLock() 的時候,需要傳遞一個 Flag,而和屏幕相關(guān)的三個 Flag,在 Api Level 17+ 以上均已經(jīng)被標識為 @Deprecated 了。
這三個 Flag 分別是:
- SCREEN_DIM_WAKE_LOCK:只限制屏幕,保證亮起,但是允許它亮度變低。
- SCREEN_BRIGHT_WAKE_LOCK:保證屏幕***亮,但是鍵盤背光燈允許熄滅。
- FULL_WAKE_LOCK:保證屏幕***亮度,并且鍵盤背光燈不允許熄滅。
當然,有時候一些被標記為 @Deprecated 的 Api,雖然不再推薦使用,但是依然是可用的。可惜 WakeLock 不在此列,它在高版本上真的被廢棄了,你再使用它去阻止息屏,你會發(fā)現(xiàn)真的沒有效果。
其實這也很好理解,PowerManager 本身就是一個系統(tǒng)資源,如果任由開發(fā)者去使用它,可能導致屏幕永遠沒有機會息屏??善聊徽呛碾姶髴?,對于 Android 節(jié)能的思想,肯定是要被限制的。
既然 Google 已經(jīng)對它標志位 @Deprecated ,并且實際上也不起作用了,我們就不要再使用它了。不過呢,Google 在廢棄這些 Api 的同時,也提供了對應(yīng)的解決方案,那就是使用 FLAG_KEEP_SCREEN_ON,接下去了解它。
2、FLAG_KEEP_SCREEN_ON
WakeLock 的 FULL_WAKE_LOCK 在被標記為廢棄的同時,還提供了一個解決方案,那就是使用 FLAG_KEEP_SCREEN_ON 來控制屏幕常亮。
FLAG_KEEP_SCREEN_ON 使用起來也非常的簡單,它是一個頁面 Window 對象上的一個 Flag ,使用 addFlags() 方法就可以添加。
- getWindow().
- addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
當然,這里使用完成之后,也是需要取消掉的。取消這個 Flag 使用 clearFlags() 方法來取消。
- getWindow().
- clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
通常我們會在一個 Activity 的 onResume() 和 onPause() 方法中,分別調(diào)用這兩個方法。
看看 FLAG_KEEP_SCREEN_ON 的文檔解釋。
- /**
- * Window flag: as long as this window is visible to the user, keep
- * the device's screen turned on and bright.
- */
- public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;
從這里可以看出來,它只作用在一個被顯示的 Window 上,并且保持設(shè)備屏幕高亮度的常亮。
其實這里也可以看出來,官方廢棄 WakeLock 而推薦使用 FLAG_KEEP_SCREEN_ON ,一部分原因在于 WakeLock 是一個全局的資源,而 FLAG_KEEP_SCREEN_ON 只是一個和 window 相關(guān)的資源,作用范圍更小了一些。并且它比 WakeLock 更好的一點在于,它不需要額外的申請權(quán)限,一般來說,我們還是推薦使用它的。
3、keepScreenOn
除了給 Window 添加一個 FLAG_KEEP_SCREEN_ON 的 Flag 之外,還可以對當前頁面中,可見的 View 調(diào)用 setKeepScreenOn() 方法來設(shè)置屏幕常亮。
setKeepScreenOn() 是 View 對象上的方法,同時也提供了布局中的屬性 android:keepScreenOn="true" 來方便我們在布局中對其進行設(shè)置。
需要注意的一點,使用 setKeepScreenOn() 設(shè)置的常亮標識,需要當前 View 保持屏幕可見才行。所以一般而言,我們會在頁面的根布局中,添加此屬性。
- /**
- * View flag indicating that the screen should remain on while the
- * window containing this view is visible to the user. This effectively
- * takes care of automatically setting the WindowManager's
- * {@link WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON}.
- */
- public static final int KEEP_SCREEN_ON = 0x04000000;
通過注釋文檔可以看到,實際上它的原理和 FLAG_KEEP_SCREEN_ON 一樣的,只是它更簡單,只需要對某個 View 設(shè)置,如果該 View 可見即生效,否者就不生效。
4、MediaPlayer的 setScreenOnWhilePlaying()
如果我們是使用一個 MediaPlayer 來進行視頻播放的話,MediaPlayer 還提供了 setScreenOnWhilePlaying() 方法,來設(shè)置屏幕常量。
它的方法實現(xiàn)如下:
- /**
- * Control whether we should use the attached SurfaceHolder to keep the
- * screen on while video playback is occurring. This is the preferred
- * method over {@link #setWakeMode} where possible, since it doesn't
- * require that the application have permission for low-level wake lock
- * access.
- *
- * @param screenOn Supply true to keep the screen on, false to allow it
- * to turn off.
- */
- public void setScreenOnWhilePlaying(boolean screenOn) {
- if (mScreenOnWhilePlaying != screenOn) {
- if (screenOn && mSurfaceHolder == null) {
- Log.w(TAG, "setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder");
- }
- mScreenOnWhilePlaying = screenOn;
- updateSurfaceScreenOn();
- }
- }
之后通過 updateSurfaceScreenOn() 方法來限制屏幕是否常亮。
- private void updateSurfaceScreenOn() {
- if (mSurfaceHolder != null) {
- mSurfaceHolder.setKeepScreenOn(mScreenOnWhilePlaying && mStayAwake);
- }
- }
它操作的是 SurfaceHolder 的 setKeepScreenOn() 方法,而另外一個條件 mStayAwake ,實際上就是當前的播放狀態(tài),當正在播放的時候,它就為 true,所以使用這種方式,只會在視頻播放的時候,保持屏幕常亮,正常來說這也是我們對一般播放器的要求。
三、小結(jié)
看完本篇文章,你應(yīng)該知道當你需要保持屏幕常亮的時候,你需要如何做了吧!
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】