美文网首页systemui手机管理
android7.0锁屏(一)锁屏结构与启动流程

android7.0锁屏(一)锁屏结构与启动流程

作者: Lonelyyy | 来源:发表于2017-12-01 00:11 被阅读0次

自从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去创建具体的密码界面,后面就是具体的上锁流程了,放到后面再讲

相关文章

网友评论

    本文标题:android7.0锁屏(一)锁屏结构与启动流程

    本文链接:https://www.haomeiwen.com/subject/nacavxtx.html