以下分析基於android2.2的google源碼。
開機啟動時,首先執行PhoneWindowManager.systemReady()(這之前的流程不分析)。調用KeyguardViewMediator.onSystemReady()進行待機鎖屏及解鎖邏輯。
KeyguardViewMediator是整個待機解/鎖屏業務的調度器,負責調度鎖定畫面的相關動作及查詢解鎖屏狀態,包括以下一些內容:
查詢鎖屏狀態,及當前處於鎖屏狀態還是已解鎖狀態,PhoneWindowManager持有KeyguardViewMediator的引用,當使用者觸控螢幕幕或者按下某個鍵是,PhoneWindowManager會通過KeyguardViewMediator查詢鎖屏狀態(鎖定/解鎖),進行不同的響應處理。如果處於鎖定狀態,系統輸入事件會受到限制。
響應電源事件(黑/亮屏)。判斷鎖定畫面應該處於什麼狀態(顯示或者重設)。手機黑屏後,鎖定畫面馬上就會顯示出來,以便下一次亮屏後,馬上就能顯示鎖定畫面,而不會出現閃爍或延時。
其他應用程式或者服務也可以請求禁止鎖屏(通過調用KeyguardViewMediator的setKeyguardEnabled(boolean)方法)。例如接聽來電介面。
KeyguardViewMediator類在WindowManagerPolicy(在手機系統中是PhoneWindowManager執行個體)初始化時被建立,並運行在它的線程上,鎖屏的UI介面也是在這個線程上建立及顯示的。KeyguardViewMediator類提供的狀態查詢api可以被諸如android.view.WindowManager、com.android.server.InputManager等其它線程調用,所以,KeyguardViewMediator類上的這些api方法都是線程同步的(synchronized)。
KeyguardViewMediator可以進行的調度操作包括:
1) 點亮螢幕pokeWakelock();
2) 報告鎖屏許可權驗證是否成功keyguardDone(boolean);
3) 響應SIM卡狀態變化並對鎖定畫面做相應的調整onSimStateChanged()。
4) 調度待機鎖屏UI介面的管理,包括顯示handleShow ()、隱藏handleHide ()、重設handleReset ()、點亮螢幕handleWakeWhenReady()等,KeyguardViewMediator實現這部分調度是通過持有一個KeyguardViewManager來實現的。
KeyguardUpdateMonitor是所有會影響整個待機解/鎖屏業務的事件的監控器。(除了作為監控器,它還發揮著類似內容相關的作用,也許我們應該把這個類命名為(KeyguardContext)。它監控諸如時間改變、電池狀態改變、時區改變、SIM卡狀態變化、電話狀態變化、電話訊號變化等事件。它是一個觀察者模式的被觀察對象。觀察者通過調用KeyguardUpdateMonitor的registerInfoCallback(InfoCallback)和registerSimStateCallback(SimStateCallback)方法進行註冊,觀察自己感興趣的變化。KeyguardUpdateMonitor的觀察者包括KeyguardViewMediator、LockScreen、PatternUnlockScreen、AccountUnlockScreen、PasswordUnlockScreen、SimUnlockScreen等。觀察者通過調用KeyguardUpdateMonitor的removeCallback(Object)取消觀察。
KeyguardViewManager負責管理待機屏UI介面的建立、顯示、隱藏、重設以及通過一個回調KeyguardViewCallback通知調度器KeyguardViewMediator進行相關的調度。
LockPatternKeyguardView(KeyguardViewBase)是所有鎖屏和解鎖UI介面的宿主。它有2個模式Mode. LockScreen和Mode. UnlockScreen。它負責根據當前上下文環境切換當前應該顯示的待機屏。它提供一個回調給當前顯示的待機屏並處理其回調,如果回調動作是自己處理不了的,則繼續報告給KeyguardViewMediator進行處理。
鎖定畫面就是LockScreen;解鎖介面包括SIM卡解鎖SimUnlockScreen、圖案解鎖PatternUnlockScreen、密碼解鎖PasswordUnlockScreen、帳號解鎖AccountUnlockScreen
解鎖成功後,鎖屏流程轉到KeyguardViewMediator的keyguardDone(boolean, boolean) 進行後續的流程(如轉到Launcher案頭)。