自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

設(shè)備息屏?不存在的!保持 Android 常亮的幾種方法!

企業(yè)動態(tài)
在實際開發(fā)過程中,會有一些需要保持屏幕常亮的需求。如果不特殊設(shè)置,通常我們的手機在靜置一段時間之后,就會自動進入息屏狀態(tài),而我們要做的就是阻止它進入息屏狀態(tài)。

[[218814]]

一、前言

在實際開發(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)限。

  1. <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() 方法就可以添加。

  1. getWindow(). 
  2. addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

當然,這里使用完成之后,也是需要取消掉的。取消這個 Flag 使用 clearFlags() 方法來取消。

  1. getWindow(). 
  2. clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

通常我們會在一個 Activity 的 onResume() 和 onPause() 方法中,分別調(diào)用這兩個方法。

看看 FLAG_KEEP_SCREEN_ON 的文檔解釋。

  1. /**  
  2. *  Window flag: as long as this window is visible to the user, keep 
  3. *  the device's screen turned on and bright. 
  4. */ 
  5. 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 保持屏幕可見才行。所以一般而言,我們會在頁面的根布局中,添加此屬性。

  1. /** 
  2. View flag indicating that the screen should remain on while the 
  3. * window containing this view is visible to the user.  This effectively 
  4. * takes care of automatically setting the WindowManager's 
  5. * {@link WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON}. 
  6. */ 
  7. public static final int KEEP_SCREEN_ON = 0x04000000; 

通過注釋文檔可以看到,實際上它的原理和 FLAG_KEEP_SCREEN_ON 一樣的,只是它更簡單,只需要對某個 View 設(shè)置,如果該 View 可見即生效,否者就不生效。

4、MediaPlayer的 setScreenOnWhilePlaying()

如果我們是使用一個 MediaPlayer 來進行視頻播放的話,MediaPlayer 還提供了 setScreenOnWhilePlaying() 方法,來設(shè)置屏幕常量。

它的方法實現(xiàn)如下:

  1. /** 
  2.  * Control whether we should use the attached SurfaceHolder to keep the 
  3.  * screen on while video playback is occurring.  This is the preferred 
  4.  * method over {@link #setWakeMode} where possible, since it doesn't 
  5.  * require that the application have permission for low-level wake lock 
  6.  * access. 
  7.  * 
  8.  * @param screenOn Supply true to keep the screen onfalse to allow it 
  9.  * to turn off
  10.  */ 
  11. public void setScreenOnWhilePlaying(boolean screenOn) { 
  12.     if (mScreenOnWhilePlaying != screenOn) { 
  13.         if (screenOn && mSurfaceHolder == null) { 
  14.             Log.w(TAG, "setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder"); 
  15.         } 
  16.         mScreenOnWhilePlaying = screenOn; 
  17.         updateSurfaceScreenOn(); 
  18.     } 

之后通過 updateSurfaceScreenOn() 方法來限制屏幕是否常亮。

  1. private void updateSurfaceScreenOn() { 
  2.     if (mSurfaceHolder != null) { 
  3.         mSurfaceHolder.setKeepScreenOn(mScreenOnWhilePlaying && mStayAwake); 
  4.     } 

它操作的是 SurfaceHolder 的 setKeepScreenOn() 方法,而另外一個條件 mStayAwake ,實際上就是當前的播放狀態(tài),當正在播放的時候,它就為 true,所以使用這種方式,只會在視頻播放的時候,保持屏幕常亮,正常來說這也是我們對一般播放器的要求。

三、小結(jié)

看完本篇文章,你應(yīng)該知道當你需要保持屏幕常亮的時候,你需要如何做了吧!

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2023-10-30 08:22:58

Android常亮Activity

2009-09-01 18:35:53

C#判斷文件存在

2018-07-03 14:20:10

數(shù)據(jù)庫恢復備份

2018-07-19 06:14:09

2021-01-25 07:21:24

GitHub 開源代碼下載

2023-09-12 08:02:13

viewport斷點

2024-12-13 08:25:59

DML操作SQL

2020-11-03 10:23:22

云計算容器技術(shù)

2024-07-22 08:03:55

2019-12-31 09:11:01

后臺Android系統(tǒng)

2012-05-16 11:35:16

SQL Server拒絕訪問

2017-12-07 14:57:13

404互聯(lián)網(wǎng)錯誤代碼

2017-12-26 08:25:57

硬盤數(shù)據(jù)丟失

2024-06-03 08:26:34

Android開發(fā)監(jiān)聽器

2021-09-26 05:05:09

WindowWeb JS

2013-08-21 11:31:21

iPhone圖片方法

2010-06-03 08:55:43

LINQ

2009-09-18 12:29:55

2010-05-17 15:17:06

MySQL常用操作

2018-07-03 10:09:18

閃存
點贊
收藏

51CTO技術(shù)棧公眾號