Keyguard鎖屏的加載可能和咱們想象的不同,它是在滅屏的時候加載,這樣能夠確保的屏幕亮起來的時候,用戶能第一時間看到鎖屏界面。滅屏存在多種方式,例如按power鍵、屏幕超時等,這些滅屏的方式雖然不同,可是異曲同工,咱們主要分析按power鍵時,Keyguard的加載流程。安全
按鍵事件的響應是在InputManagerService中,通過一系列的處理和轉換最終將會傳遞到PhoneWindowManager(PWM)的interceptKeyBeforeQueueing()來作具體的業務邏輯,這裏咱們不分析前面的過程,主要是從PWM開始分析。ide
Keyguard的加載從finishedGoingToSleep()開始,依次傳遞,期間還通過IPC過程調用IKeyguardService,最後傳到KeyguardViewMediator這裏。KeyguardViewMediator這個類是解鎖屏模塊的中介者,以中介的身份處理keyguard狀態變化,處理event、power管理、PhoneWindowManager通知等請求,並做爲回調對象供解鎖屏模塊的其它類回調。spa
繼續往前執行,經過Handler跨線程調用StatusBarKeyguardViewManager,再調用KeyguardBouncer的onScreenTurnedOff(),這裏有一個判斷,若是此時是在Bouncer界面,那就會調用KeyguardHostView的onPause()方法去暫停,而在其餘Bouncer不可見的界面,就不須要調用onPause()方法,顯然由於它都沒顯示因此不須要去Pause()。
往下又經過Handler去調用了KeyguardUpdateMoniter.handleFinishedGoingToSleep(),這裏主要是去更新指紋解鎖的狀態,由於滅屏了若是有指紋的話就能夠開始監聽指紋解鎖,就是在這裏去開始監聽;值得一提的是,現現在的人臉解鎖也是在這個地方去更新狀態,所不一樣的是,人臉須要亮屏纔開始監聽。線程
繼續往前執行,接下來就要處理Keyguard繪製的邏輯了,這部分主要是在StatusBarKeyguardViewManager中,首先會調用StatusBarWindowManager去更新當前的視圖,這個方法只要是手機屏幕視圖改變就會被調用,因此在Keyguard繪製完成後,還會調用一次。接着調用reset()去重置view的狀態,而後調用showBouncerOrKeyguard()方法去顯示notification keyguard仍是bouncer,在滅屏的狀況下,再次亮屏看到的通常是notification keyguard,就是有消息通知、時間之類的那個view,上滑纔會顯示密碼解鎖界面,也就是bouncer。接着就會調用showKeyguard(),固然因爲尚未繪製內容,因此會進行keyguard的繪製。這裏會調用hideBouncer()去隱藏已有的bouncer,由於下次亮屏的時候可能不是原來的鎖屏方式。例如原來是PIN解鎖,而咱們在settings去重置了鎖屏爲patten,那下次亮屏就應該顯示patten的view。對象
接下來就要繪製新的bouncer了,調用prepare(),往下執行到keyguardSecurityContainer的showSecurityScreen(),這裏會根據當前的設置的安全模式,也就是鎖屏方式,去獲取相應的SecurityView,這裏咱們不研究各類鎖屏方式的view具體怎麼繪製,只關心keyguard view的繪製,因此不往下深究。在獲取到新的securityview以後,調用onResume()方法,而後繪製到keyguard上。
從時序圖上面能夠看出來,這系列操做是串行的,因此在繪製完成以後,KeyguardViewMediator的handleShow()會調用KeyguardDisplayManager的show()方法,此時Keyguard就已經繪製完畢了,固然由於已經滅屏了,因此你並不能看到界面,當下次亮屏的時候,就會看到繪製好了的keyguard。blog