1. 程式人生 > >Android亮屏和熄屏控制

Android亮屏和熄屏控制

一.  前言
我們的Android應用程式很多需要和亮屏和熄屏打交道,比如鬧鐘的時候,需要保持亮屏,之後又需要熄屏。那麼今天,我們來分析下這方面的功能。

二.  系統服務 --- PowerManager.java
顧名思義,PowerManager.java就是管理我們電源方面的功能的,當然也包括我們螢幕的亮和熄滅。沒錯,我們的應用程式就是通過這個系統服務來實現亮屏和熄屏的功能的。
1.  應用程式獲取PowerManager服務, 我們可以這樣書寫:
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

     因為PowerManager是系統服務,所以它的生命週期不是應用程式所能控制的;應用程式只能通過系統,向系統請求獲取PowerManager服務,然後系統把這個服務的應用給我們。
2.  goToSleep()方法, 這個方法可以強制我們的螢幕熄屏。我們可以這樣呼叫:
     在上面拿到pm物件之後,這樣呼叫 pm.goToSleep(SystemClock.uptimeMillis());
3.  setBacklightBrightness()方法,這個方法可以設定背光的亮度,從0-255 

三.  定時熄滅螢幕
那麼這裡,還可以介紹一個控制螢幕的方法就是PowerManager.WakeLock

顧名思義,WakeLock這個東西就是亮屏控制,這裡說的亮屏,它定義了幾種型別的亮屏。如下:
各種鎖的型別對CPU 、螢幕、鍵盤的影響:

PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。

SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,允許保持螢幕高亮顯示,允許關閉鍵盤燈

FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度

ACQUIRE_CAUSES_WAKEUP:正常喚醒鎖實際上並不開啟照明。相反,一旦開啟他們會一直仍然保持(例如來世user的activity)。當獲得wakelock,這個標誌會使螢幕或/和鍵盤立即開啟。一個典型的使用就是可以立即看到那些對使用者重要的通知。

ON_AFTER_RELEASE:設定了這個標誌,當wakelock釋放時使用者activity計時器會被重置,導致照明持續一段時間。如果你在wacklock條件中迴圈,這個可以用來減少閃爍

由於它定義了這麼多型別,每種型別可以指定相對應的部件工作和不工作。那麼我們就可以利用這些型別,從最細粒度來控制我們的螢幕,控制我們的電源,從而讓我們的電源工作時間儘可能的延長

怎麼使用這個WakeLock呢?我們可以這樣寫:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");  
wakeLock.acquire();  
//做我們的工作,在這個階段,我們的螢幕會持續點亮
//釋放鎖,螢幕熄滅。
wl.release();

那麼這裡我們也可以這樣使用,就是多少時間後熄滅螢幕
首先點亮螢幕
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");  
wakeLock.acquire();  
然後
mTimeHandler.postDelayed(new Runnable(){
                public void run(){
                    wakeLock.release();
                }
            }, 10*1000);
嗯,延遲10s後熄滅螢幕。。。。

那麼,這裡要注意的是acquire()和release()要成對呼叫哦!也就是說,你申請了亮屏,過段時間,你要釋放它。

   Android中的兩把鎖 – WalkLock and KeyguardLock 詳細分析
       WalkLock – 顧名思義 喚醒鎖 點亮螢幕用的
       KeyguardLock – 顧名思義 鍵盤鎖 解鎖鍵盤用的

       詳細介紹:
1: WalkLock 喚醒鎖
       WalkLock真的能點亮螢幕嗎?
       答案是肯定的。 可是有時候為什麼不點亮螢幕,這個就是引數設定的問題了。

java程式碼:

  1. PowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Gank");
  2. PowerManager.FULL_WAKE_LOCK //這個引數是手機點亮的程度,(什麼Cpu,螢幕亮度,鍵盤燈)
  3. PowerManager.ACQUIRE_CAUSES_WAKEUP //關鍵是這個引數的理解。 
       WalkLock點亮螢幕並非真的去點亮了螢幕,你可以理解為,它通過Android元件(Activity)去點亮了螢幕。
       假如一個通知想去點亮螢幕,問題來了,它能點亮嗎? 肯定不行。
不過擁有這個PowerManager.ACQUIRE_CAUSES_WAKEUP引數,你就可以點亮螢幕了。它使WalkLock不再依賴元件就可以點亮螢幕了。

       WalkLock如何獲得螢幕的狀態?
       PowerManager.isScreenOn()方法;這個方法返回true: 螢幕是喚醒的  返回false:螢幕是休眠的

       WalkLock喚醒和休眠的方法?
       WalkLock.aquire() 在螢幕休眠的狀態下喚醒螢幕
       WalkLock.release() 在螢幕點亮的狀態下,使螢幕休眠。
       WalkLock.release()這個方法有個需要注意的地方:

       例如:WalkLockA物件先喚醒了螢幕再使螢幕休眠。

       螢幕本身就是喚醒狀態,WalkLockA物件沒有喚醒過螢幕,WalkLockA物件如果嘗試使螢幕休眠。會產生一個異常 UnLock Sreen。

 2:KeyguardLock 鍵盤鎖
       KeyguardLock獲得當前螢幕是否解鎖?
       KeygroundManager.inKeyguardRestrictedInputMode() 返回true表示鍵盤鎖住, 返回false表示鍵盤解鎖中

       KeyguardLock給螢幕解鎖和上鎖?
       KeyguardLock.disableKeyguard()解鎖鍵盤
       KeyguardLock.reenableKeyguard()鎖鍵盤
       KeyguardLock沒有上面喚醒鎖的問題,就是無論你鍵盤是否由KeyguardLockA解鎖,你呼叫KeyguardLockA
物件的reenableKeyguard()方法都不會有異常。

       這兩把鎖一些概念性的理解,假如你認為你獲得了一個鍵盤鎖物件,你就可以鎖螢幕了。這個就大錯特錯了。

       你鎖不了其他程式開啟的螢幕(如果可以的話,一個for迴圈一直鎖你螢幕,你哭都沒眼淚)
       你可以控制自己的鎖,別想著別人的鎖。

最後總結下用法:
       一般這兩把鎖都是配合使用的,你解鎖螢幕的時候肯定不希望螢幕漆黑一片。關閉鍵盤鎖的時候希望螢幕也同時休眠。

問題:

       1:我嘗試手動關閉螢幕,可是總繼續亮那麼一小會。
       2:如果手機自動關閉螢幕的話,不會有這個問題。

       主要程式碼展示:

java程式碼:

  1. KeyguardManager keyguardManager = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
  2. KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("隨便寫點啥都行");
  3. keyguardLock.disableKeyguard(); 

java程式碼:

  1. /**
  2. * 點亮螢幕
  3. */
  4. private void lightScreen(){
  5. PowerManager powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
  6. WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,"" );
  7. wakeLock.acquire();
轉自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=95030