成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[218814]]

一、前言

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

這個功能,使用場景要從實際情況出發,例如:播放器,還有一些向智能電視投屏的手機 App ,都可能會有類似的需要。

本篇文章就對 Android 下,如何保持屏幕常亮,做一個簡單的記錄和總結。

二、幾種常見的方法

2.1 被廢棄的 WakeLock

如果你看過比較早的 Android 教程類的書籍的話,在說到保持屏幕常亮這個需求的時候,你應該會想到 WakeLock。可惜如果你現在還想只用 WakeLock 來限制屏幕常亮,你會發現已經做不到了,不過作為一個教科書式的方法,雖然已經被遺棄了,我們還是先來了解一下它。

WakeLock 使用起來也非常的簡單。

從上面的例子可以看到,WakeLock 主要是通過一個系統服務 PowerManager,然后通過調用它的 acquire() 方法獲取一個 WakeLock 資源。

WakeLock 本身也是一種資源,在使用完成之后,別忘了調用 release() 方法進行釋放。

而使用 WakeLock 還需要額外的聲明 WAKE_LOCK 權限。

  1. <uses-permission android:name="android.permission.WAKE_LOCK" /> 

前面使用 newWakeLock() 的時候,需要傳遞一個 Flag,而和屏幕相關的三個 Flag,在 Api Level 17+ 以上均已經被標識為 @Deprecated 了。

這三個 Flag 分別是:

  • SCREEN_DIM_WAKE_LOCK:只限制屏幕,保證亮起,但是允許它亮度變低。
  • SCREEN_BRIGHT_WAKE_LOCK:保證屏幕***亮,但是鍵盤背光燈允許熄滅。
  • FULL_WAKE_LOCK:保證屏幕***亮度,并且鍵盤背光燈不允許熄滅。

當然,有時候一些被標記為 @Deprecated 的 Api,雖然不再推薦使用,但是依然是可用的。可惜 WakeLock 不在此列,它在高版本上真的被廢棄了,你再使用它去阻止息屏,你會發現真的沒有效果。

其實這也很好理解,PowerManager 本身就是一個系統資源,如果任由開發者去使用它,可能導致屏幕永遠沒有機會息屏。可屏幕正是耗電大戶,對于 Android 節能的思想,肯定是要被限制的。

既然 Google 已經對它標志位 @Deprecated ,并且實際上也不起作用了,我們就不要再使用它了。不過呢,Google 在廢棄這些 Api 的同時,也提供了對應的解決方案,那就是使用 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() 方法中,分別調用這兩個方法。

看看 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 上,并且保持設備屏幕高亮度的常亮。

其實這里也可以看出來,官方廢棄 WakeLock 而推薦使用 FLAG_KEEP_SCREEN_ON ,一部分原因在于 WakeLock 是一個全局的資源,而 FLAG_KEEP_SCREEN_ON 只是一個和 window 相關的資源,作用范圍更小了一些。并且它比 WakeLock 更好的一點在于,它不需要額外的申請權限,一般來說,我們還是推薦使用它的。

3、keepScreenOn

除了給 Window 添加一個 FLAG_KEEP_SCREEN_ON 的 Flag 之外,還可以對當前頁面中,可見的 View 調用 setKeepScreenOn() 方法來設置屏幕常亮。

setKeepScreenOn() 是 View 對象上的方法,同時也提供了布局中的屬性 android:keepScreenOn="true" 來方便我們在布局中對其進行設置。

需要注意的一點,使用 setKeepScreenOn() 設置的常亮標識,需要當前 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 設置,如果該 View 可見即生效,否者就不生效。

4、MediaPlayer的 setScreenOnWhilePlaying()

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

它的方法實現如下:

  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 ,實際上就是當前的播放狀態,當正在播放的時候,它就為 true,所以使用這種方式,只會在視頻播放的時候,保持屏幕常亮,正常來說這也是我們對一般播放器的要求。

三、小結

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

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2023-10-30 08:22:58

Android常亮Activity

2009-09-01 18:35:53

C#判斷文件存在

2023-09-12 08:02:13

viewport斷點

2018-07-19 06:14:09

2021-01-25 07:21:24

GitHub 開源代碼下載

2018-07-03 14:20:10

數據庫恢復備份

2024-12-13 08:25:59

DML操作SQL

2020-11-03 10:23:22

云計算容器技術

2024-07-22 08:03:55

2017-12-07 14:57:13

404互聯網錯誤代碼

2017-12-26 08:25:57

硬盤數據丟失

2012-05-16 11:35:16

SQL Server拒絕訪問

2019-12-31 09:11:01

后臺Android系統

2021-09-26 05:05:09

WindowWeb JS

2024-06-03 08:26:34

Android開發監聽器

2009-09-18 12:29:55

2010-05-17 15:17:06

MySQL常用操作

2011-07-13 10:01:16

域控制器

2009-09-12 09:34:18

Windows 7中國售價

2015-10-20 10:30:59

創業時機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久午夜精品 | 日本三级电影免费 | 久久久精品一区二区三区四季av | 久久久国产一区二区三区 | 国产精品成人久久久久 | 久久99精品久久久97夜夜嗨 | av一级毛片| 久久久久国产一级毛片高清网站 | 视频一区二区在线 | 天天影视网天天综合色在线播放 | 97国产精品 | 久久久精品在线 | 成人av观看 | 免费观看的黄色网址 | 一区二区免费在线观看 | 在线观看中文字幕 | 久久精品黄色 | 日韩精品久久一区二区三区 | 国产又爽又黄的视频 | 在线一区视频 | 精品乱码一区二区三四区视频 | 天天草天天干天天 | 中文字幕高清 | 亚洲福利一区 | 久久久国产一区二区三区四区小说 | 韩国主播午夜大尺度福利 | 久久精品中文字幕 | 久久国产精品首页 | 99精品在线观看 | 一级片av | 国产精品久久久久久久久久久久 | 日韩高清国产一区在线 | 久久综合九色综合欧美狠狠 | 日韩二三区 | 91在线| 黄色成人国产 | 7777在线视频| 日韩欧美在线视频一区 | 久久免费视频在线 | 美国a级毛片免费视频 | 精品福利在线 |