博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android O(8.0) Keyguard解锁流程
阅读量:2071 次
发布时间:2019-04-29

本文共 1751 字,大约阅读时间需要 5 分钟。

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。

转载地址:http://dpvmf.baihongyu.com/

你可能感兴趣的文章
Java中多线程向mysql插入同一条数据冲突问题
查看>>
Idea Maven项目使用jar包,添加到本地库使用
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>
问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
查看>>
目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
查看>>
问题:Mysql中字段类型为text的值, java使用selectByExample查询为null
查看>>
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>
composer install或composer update 或 composer require phpoffice/phpexcel 失败解决办法
查看>>
TP5.1项目从windows的Apache服务迁移到linux的Nginx服务需要注意几点。
查看>>
win10安装软件 打开时报错 找不到 msvcp120.dll
查看>>
PHPunit+Xdebug代码覆盖率以及遇到的问题汇总
查看>>
PHPUnit安装及使用
查看>>
PHP项目用xhprof性能分析(安装及应用实例)
查看>>