Android SystemUI组件(07)锁屏KeyguardViewMediator分析

该系列文章总纲链接:专题总纲目录 Android Framework 总纲


本章关键点总结 & 说明:

说明:本章节持续迭代之前章节的思维导图,主要关注左侧上方锁屏分析部分即可。

为了更好理解本文的内容,优先说明下SystemUI中与Keyguard(锁屏)相关的类,主要包括:

  • KeyguardViewMediator:这是一个中介类,它负责管理锁屏的状态,包括锁屏的显示和隐藏,以及与锁屏相关的各种事件处理。它还负责在系统启动时初始化锁屏界面,并在设备准备好时启动锁屏。
  • KeyguardService:这个类是锁屏服务的入口点,它接收来自系统其他部分的请求,如启动锁屏或结束锁屏动画。
  • StatusBarKeyguardViewManager:负责管理状态栏中的锁屏视图,包括显示和隐藏锁屏界面。
  • KeyguardUpdateMonitor:监控系统的各种状态变化,如电池状态、时间变化等,并在这些变化发生时更新锁屏界面。
  • KeyguardBouncer:负责显示解锁界面,包括图案、PIN、密码等解锁方式。它处理用户的解锁尝试,并在成功或失败时提供反馈。
  • KeyguardHostView:是锁屏界面的根视图,它承载了所有的解锁方式视图。
  • KeyguardSecurityContainer:包含解锁方式的容器,如图案、PIN、密码等。
  • KeyguardPatternViewKeyguardPINViewKeyguardPasswordView:这些类分别对应不同的解锁方式,它们实现了用户与锁屏界面的交互。
  • KeyguardManager:系统服务,用于管理系统锁屏的状态,如启用或禁用锁屏。

这些类共同工作,提供了一个完整的锁屏体验,包括显示锁屏界面、处理用户解锁尝试、以及在设备准备好时启动锁屏。这些类构成了锁屏功能的核心。

接下来我们从KeyguardViewMediator.start开始分析,一直到KeyguardViewMediator的关键逻辑:doKeyguardLocked方法的内部实现,想了解为什么要从这里开始分析的,可以查看文章:Android SystemUI组件(01)SystemUIService启动

1 KeyguardViewMediator start启动分析

锁屏KeyguardViewMediator是在systemUI中启动的,从KeyguardViewMediator.start()开始分析。对应代码实现如下:

public class KeyguardViewMediator extends SystemUI {
    private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
    private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;

    private static final boolean DEBUG = KeyguardConstants.DEBUG;
    private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES;
    private final static boolean DBG_WAKE = false;

    private final static String TAG = "KeyguardViewMediator";
    //...
    @Override
    public void start() {
        synchronized (this) {
            setupLocked();//初始化与锁屏相关的状态和组件
        }
        //将当前实例(this)注册到一个组件管理系统中,以便其他部分的代码可以访问和使用这个实例
        putComponent(KeyguardViewMediator.class, this);
    }
    //...
}

其中关于putComponent方法具体解释如下:

  1. 组件管理putComponent方法通常是一个用于注册组件的工具方法。它将当前的KeyguardViewMediator实例存储在一个全局或共享的组件容器中,使得其他类或模块可以通过这个容器来获取这个实例。

  2. 依赖注入:这种做法类似于依赖注入(Dependency Injection),允许系统中的其他部分在需要时获取KeyguardViewMediator的实例,而不需要直接创建它。这样可以减少类之间的耦合,提高代码的可维护性。

  3. 方便访问:通过将KeyguardViewMediator实例放入组件管理系统,其他类可以方便地访问锁屏的相关功能和状态。例如,其他类可能会调用getComponent(KeyguardViewMediator.class)来获取当前的锁屏管理器实例,以便进行锁屏状态的检查或更新。

接下来我们详细分析代码setupLocked的实现,具体如下:

public class KeyguardViewMediator extends SystemUI {
    //...
    private void setupLocked() {
        // 初始化系统服务和锁屏相关的WakeLock
        mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWM = WindowManagerGlobal.getWindowManagerService();
        mTrustManager = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
        mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard");
        mShowKeyguardWakeLock.setReferenceCounted(false);

        // 注册一个广播接收器,用于处理延迟锁屏的动作
        mContext.registerReceiver(mBroadcastReceiver, new IntentFilter(DELAYED_KEYGUARD_ACTION));

        // 初始化锁屏显示管理器和闹钟管理器服务
        mKeyguardDisplayManager = new KeyguardDisplayManager(mContext);
        mAlarmManager = (AlarmManager) mContext.getSystemService(Cont
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值