【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“Android 待机流程解析 - 综合课件“提供大家参考,希望对大家有所帮助!
以下分析基于
android2.2的google
源码。
开机启动时首先执行PhoneWindowManager.systemReady这之前的流程不分析。
调用KeyguardViewMediator.onSystemReady进行待机锁屏及解锁逻辑。
KeyguardViewMediator是整个待机解/锁屏业务的调度器负责调度锁屏界面的相关动作及查询解锁屏状态 包括以下一些内容 查询锁屏状态及当前处于锁屏状态还是已解锁状态PhoneWindowManager持有KeyguardViewMediator的引用当用户触 摸屏幕或者按下某个键是PhoneWindowManager会通过KeyguardViewMediator查询锁屏状态锁定/解锁进行不同的 响应处理。
如果处于锁定状态系统输入事件会受到限制。
响应电源事件黑/亮屏。
判断锁屏界面应该处于什么状态显示或者重置。
手机黑屏后锁屏界面马上就会显示出来以便下一次亮屏后马上就能显示锁屏界面而不会出现闪烁或延时。
其他应用程序或者服务也可以请求禁止锁屏通过调用KeyguardViewMediator的setKeyguardEnabledboolean方法。
例如接听来电界面。
KeyguardViewMediator类在WindowManagerPolicy在手机系统中是PhoneWindowManager实例初始 化时被创建并运行在它的线程上锁屏的UI界面也是在这个线程上创建及显示的。
KeyguardViewMediator类提供的状态查询api可以被 诸如
android.view.WindowManager、com.
android.server.InputManager等其它线程调用所 以KeyguardViewMediator类上的这些api方法都是线程同步的synchronized。
KeyguardViewMediator可以进行的调度操作包括 1 点亮屏幕pokeWakelock 2 报告锁屏权限验证是否成功keyguardDoneboolean 3 响应SIM卡状态变化并对锁屏界面做相应的调整onSimStateChanged。
4 调度待机锁屏UI界面的管理包括显示handleShow 、隐藏handleHide 、重置handleReset 、点亮屏幕handleWakeWhenReady等KeyguardViewMediator实现这部分调度是通过持有一个 KeyguardViewManager来实现的。
KeyguardUpdateMonitor是所有会影响整个待机解/锁屏业务的事件的监控器。
除 了作为监控器它还发挥着类似上下文的作用也许我们应该把这个类命名为KeyguardContext。
它监控诸如时间改变、电池状态改变、时区改 变、SIM卡状态变化、电话状态变化、电话信号变化等事件。
它是一个观察者模式的被观察对象。
观察者通过调用KeyguardUpdateMonitor 的registerInfoCallbackInfoCallback和 registerSimStateCallbackSimStateCallback方法进行注册观察自己感兴趣的变化。
KeyguardUpdateMonitor的观察者包括KeyguardViewMediator、LockScreen、 PatternUnlockScreen、AccountUnlockScreen、PasswordUnlockScreen、 SimUnlockScreen等。
观察者通过调用KeyguardUpdateMonitor的removeCallbackObject取消观 察。
KeyguardViewManager负责管理待机屏UI界面的创建、显示、隐藏、重置以及通过一个回调KeyguardViewCallback通知调度器KeyguardViewMediator进行相关的调度 。
LockPatternKeyguardViewKeyguardViewBase是所有锁屏和解锁UI界面的宿主 。
它有2个模式Mode. LockScreen和Mode. UnlockScreen。
它负责根据当前上下文环境切换当前应该显示的待机屏。
它提供一个回调给当前显示的待机屏并处理其回调如果回调动作是自己处理 不了的则继续报告给KeyguardViewMediator进行处理。
锁屏界面就是LockScreen解锁界面包括SIM卡解锁SimUnlockScreen、图案解锁PatternUnlockScreen、密码解锁PasswordUnlockScreen、帐号解锁AccountUnlockScreen 解锁成功后锁屏流程转到KeyguardViewMediator的keyguardDoneboolean boolean 进行后续的流程如转到Launcher桌面。