Android O(8.0) Keyguard解锁流程

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

相关文章
相关标签/搜索