Android中系統內建的鎖:WalkLock、KeyguardLock

來源:互聯網
上載者:User

標籤:

Android系統內建了兩把鎖:

(1)WalkLock:喚醒鎖,點亮螢幕用的 ;

(2)KeyguardLock:鍵盤鎖,解鎖鍵盤用的;

 

 

WalkLock 喚醒鎖

(1)WalkLock真的能點亮螢幕嗎?

  答案是肯定的,可是有時候為什麼不點亮螢幕,這個就是參數設定的問題了。

  PowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Gank");

  PowerManager.ACQUIRE_CAUSES_WAKEUP 關鍵是這個參數的理解。

  

  WalkLock點亮螢幕並非真的去點亮了螢幕,你可以理解為,它通過Android組件(Activity)去點亮了螢幕。

  假如有一個通知(notication)想去點亮螢幕,那麼問題來了,它能點亮嗎?肯定不行。

  不過擁有這個PowerManager.ACQUIRE_CAUSES_WAKEU參數,你就可以點亮螢幕了。它使WalkLock不再相依元件就可以點亮螢幕了。

 

相關參數說明

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

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

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

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

ACQUIRE_CAUSES_WAKEUP:Normal wake locks don‘t actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.

ON_AFTER_RELEASE:this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

 

 

(2)WalkLock如何獲得螢幕的狀態?

  PowerManager.isScreenOn()方法;這個方法返回true: 螢幕是喚醒的 返回false:螢幕是休眠的

 

 

(3)WalkLock喚醒和休眠的方法?

  WalkLock.aquire() 在螢幕休眠的狀態下喚醒螢幕

  WalkLock.release() 在螢幕點亮的狀態下,使螢幕休眠。

  WalkLock.release()這個方法有個需要注意的地方:

  例如:WalkLockA對象先喚醒了螢幕再使螢幕休眠,ok沒問題

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

 

 

 

KeyguardLock 鍵盤鎖 

(1)KeyguardLock獲得當前螢幕是否解鎖?

  KeygroundManager.inKeyguardRestrictedInputMode() 返回true表示鍵盤鎖住, 返回false表示鍵盤解鎖中

 

(2)KeyguardLock給螢幕解鎖和上鎖?

  KeyguardLock.disableKeyguard()解鎖鍵盤

  KeyguardLock.reenableKeyguard()鎖鍵盤

  KeyguardLock沒有上面喚醒鎖的問題,就是說無論你的鍵盤是否由KeyguardLockA解鎖,你調用KeyguardLockA對象的reenableKeyguard()方法都不會有異常。

 

 

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

你鎖不了其他程式開啟的螢幕(如果可以的話,一個for迴圈一直鎖你螢幕,你哭都沒眼淚)

你可以控制自己的鎖,別想著別人的鎖。

 

 

 

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

問題:
  1:我嘗試手動關閉螢幕,可是總繼續亮那麼一小會。

  2:如果手機自動關閉螢幕的話,不會有這個問題。

 

public void unlockScreen() {        // 擷取PowerManager的執行個體        PowerManager pm = (PowerManager) mContext                .getSystemService(Context.POWER_SERVICE);        // 得到一個WakeLock喚醒鎖        mWakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK                | PowerManager.ACQUIRE_CAUSES_WAKEUP                | PowerManager.ON_AFTER_RELEASE, "SimpleTimer");        if (!mWakelock.isHeld()) {            // 喚醒螢幕            mWakelock.acquire();        }        // 獲得一個KeyguardManager的執行個體        km = (KeyguardManager) mContext                .getSystemService(Context.KEYGUARD_SERVICE);        // 得到一個鍵盤鎖KeyguardLock        mKeyguardLock = km.newKeyguardLock("SimpleTimer");        if (km.inKeyguardRestrictedInputMode()) {            // 解鎖鍵盤            mKeyguardLock.disableKeyguard();        }    }

 

 

 


注意:這裡使用的mWakelock.isHeld())來判斷螢幕當前是否是休眠狀態,從Android 2.1 API Level7開始增加了一個判斷螢幕是否處於點亮狀態可以使用public boolean isScreenOn ()這個方法。
鎖螢幕的代碼是

    public void lockScreen() {        // release screen        if (!km.inKeyguardRestrictedInputMode()) {            // 鎖鍵盤            mKeyguardLock.reenableKeyguard();        }        // 使螢幕休眠        if (mWakelock.isHeld()) {            mWakelock.release();        }    }

 

 

 

你需要在AndroidManifest.xml中聲明該應用有設定電源管理的許可權。

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

提示:添加最後一個許可權的時候可能會提示你“Permission is only granted to system apps”,你需要clean一下

 

 

轉載地址:http://mysuperbaby.iteye.com/blog/1460948

(轉)Android中系統內建的鎖:WalkLock、KeyguardLock

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.