自从Android5.0之后,锁屏就成了systemUI的一部分,一般来说锁屏对应以下两个界面,分别称为keyguard和bouncer
image.png image.png
systemUI是一类特殊的窗口,即StatusBarWindow,锁屏是这个window的其中一个状态,从systemUI中的StatusBarState 类的定义就可以看出来
public class StatusBarState {
/**
* The status bar is in the "normal" shade mode.
*/
public static final int SHADE = 0;
/**
* Status bar is currently the Keyguard.
*/
public static final int KEYGUARD = 1;
/**
* Status bar is in the special mode, where it is fully interactive but still locked. So
* dismissing the shade will still show the bouncer.
*/
public static final int SHADE_LOCKED = 2;
/**
* Status bar is locked and shows the full screen user switcher.
*/
public static final int FULLSCREEN_USER_SWITCHER = 3;
}
当手机锁屏的时候,systemUI处于keyguard状态,占满屏幕,解锁后就进入shade状态,变成顶部的状态栏,SHADE_LOCKED 与FULLSCREEN_USER_SWITCHER 出现的情况比较少,所以不再详细说明。总之理解锁屏就需要对systemUI有一个比较全面的认识
1.systemUI的视图结构HierarchyView
systemUI还包括recents(任务管理器)等界面,只考虑状态栏窗口的话,其主要视图结构如下所示
image.png
- wallpaper是锁屏壁纸
- statusbar是桌面下的状态栏,锁屏状态下会被隐藏
- notificationpanel,即通知面板,也就是我们看到的锁屏界面,qspanel代表快捷设置面板,下拉就可以看见
- bouncer为锁屏密码界面,也包括sim卡的pin码输入界面,锁屏安全的核心代码都与bouncer相关
bouncer还可以具体细分,当然,SIM卡的输入密码界面也是bouncer的一部分,这里没有列出来,主要视图结构如下图所示,
image.png
2.systemUI与锁屏的代码结构
前面说过,研究锁屏也需要研究systemUI,systemUI的源码位于frameworks/base/packages/SystemUI/目录下,这里面与锁屏相关的代码主要是处理锁屏界面(通知面板)以及bouncer的显示隐藏,而涉及到具体密码界面和密码认证的代码放在frameworks/base/packages/Keyguard/目录下,我们看看systemUI的mk文件
LOCAL_STATIC_JAVA_LIBRARIES := \
com.mediatek.systemui.ext \
Keyguard \
android-support-v7-recyclerview \
android-support-v7-preference \
android-support-v7-appcompat \
android-support-v7-palette \
android-support-v4 \
android-support-v14-preference \
android-support-v17-leanback \
framework-protos \
SystemUI-proto-tags
Keyguard最后是作为systemUI的一个库来运行的,所以修改了Keyguard目录下的东西,需要先编译Keyguard/,然后编译SystemUI/,最后push得到的产物SystemUI.apk即可
由于Keyguard/是SystemUI的一个库,Keyguard/中的代码就无法直接持有SystemUI/中对象,这两处的代码通信一般是通过回调来实现的,在处理锁屏的事物上有两个非常重要的类
- KeyguardViewMediator.java,位于SystemUI/中,负责处理上锁和解锁的流程,控制UI的显示
-
KeyguardUpdateMonitor.java,位于Keyguard/中,保存了许多SystemUI的回调对象,同时监听系统事件(例如插入sim卡,用户切换等等)
可以用一张图来表示SystemUI与Keyguard/的通信结构
image.png
3.锁屏的启动流程
既然锁屏与SystemUI密不可分,锁屏的启动自然与SystemUI的创建而创建的,用下面一张流程图表示
image.png
SystemUI在初始化完成后会建立与Keyguard/代码之间的通信,等待开机完成之后,KeyguardService(PhoneWindowManager与Keyguard之间的桥梁,管理锁屏的显示与状态变化)创建并建立与SystemUI绑定,通知KeyguardViewMediator去创建具体的密码界面,后面就是具体的上锁流程了,放到后面再讲
网友评论