Android O(8.0) Keyguard解锁流程

概述

Keyguard锁屏的加载可能和我们想象的不一样,它是在灭屏的时候加载,这样可以确保的屏幕亮起来的时候,用户能第一时间看到锁屏界面。灭屏存在多种方式,例如按power键、屏幕超时等,这些灭屏的方式虽然不一样,但是殊途同归,我们主要分析按power键时,Keyguard的加载流程。

时序图

这里写图片描述

流程分析

按键事件的响应是在InputManagerService中,经过一系列的处理和转换最终将会传递到PhoneWindowManager(PWM)的interceptKeyBeforeQueueing()来做具体的业务逻辑,这里我们不分析前面的过程,主要是从PWM开始分析。

Keyguard的加载从finishedGoingToSleep()开始,依次传递,期间还经过IPC过程调用IKeyguardService,最后传到KeyguardViewMediator这里。KeyguardViewMediator这个类是解锁屏模块的中介者,以中介的身份处理keyguard状态变化,处理event、power管理、PhoneWindowManager通知等请求,并作为回调对象供解锁屏模块的其它类回调。

继续往前执行,通过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。

原文地址:https://blog.csdn.net/qq_28147169/article/details/79467159

猜你喜欢

转载自blog.csdn.net/f2006116/article/details/82459120