以下分析基于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桌面)。

最新文章

  1. Hadoop1 Centos伪分布式部署
  2. JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法
  3. TortoiseSVN and TortoiseGit 版本控制图标不见了
  4. Android小项目之八 界面细节
  5. Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)
  6. ASP.NET-FineUI开发实践-5
  7. android 限制adb的访问目录
  8. Protel99 SE快捷键大全
  9. 5754Life Winner Bo
  10. Tsung脚本中使用动态参数(一)---直接在脚本里编写Erlang代码
  11. 修改MacBook Pro主机名,共享电脑名
  12. Aspose实现Office转PDF (ASP.NET)
  13. 一个spring mvc 需要用到到文件
  14. socket的阻塞与非阻塞,同步与非同步
  15. Python:Day42 Position
  16. [P3385]【模板】负环 (spfa / bellman-ford)
  17. vue 在浏览器控制台怎么调试 谷歌插件vue Devtools
  18. Bootstrap3基础 text-muted/success... 辅助类样式 情景文本颜色
  19. rest api方式实现对文档库的管理
  20. mybaits拦截器+自定义注解

热门文章

  1. itertools 介绍
  2. 【SIGGRAPH】用【有说服力的照片真实】技术实现最终幻想15的视觉特效
  3. Visual Studio 2012 常用快捷键
  4. 明白何谓Margin Collapse
  5. 应该具备的调试技能(java)
  6. C#实现鸽巢排序
  7. JS创建对象总结
  8. 什么是FOUC?如何避免FOUC?///////////////////////////zzzz
  9. oauth协议
  10. URL中文乱码处理总结(转)