美文网首页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