该系列文章总纲链接:专题总纲目录 Android Framework 总纲
本章关键点总结 & 说明:
说明:本章节持续迭代之前章节的思维导图,主要关注左侧上方锁屏分析部分即可。
为了更好理解本文的内容,优先说明下SystemUI中与Keyguard(锁屏)相关的类,主要包括:
- KeyguardViewMediator:这是一个中介类,它负责管理锁屏的状态,包括锁屏的显示和隐藏,以及与锁屏相关的各种事件处理。它还负责在系统启动时初始化锁屏界面,并在设备准备好时启动锁屏。
- KeyguardService:这个类是锁屏服务的入口点,它接收来自系统其他部分的请求,如启动锁屏或结束锁屏动画。
- StatusBarKeyguardViewManager:负责管理状态栏中的锁屏视图,包括显示和隐藏锁屏界面。
- KeyguardUpdateMonitor:监控系统的各种状态变化,如电池状态、时间变化等,并在这些变化发生时更新锁屏界面。
- KeyguardBouncer:负责显示解锁界面,包括图案、PIN、密码等解锁方式。它处理用户的解锁尝试,并在成功或失败时提供反馈。
- KeyguardHostView:是锁屏界面的根视图,它承载了所有的解锁方式视图。
- KeyguardSecurityContainer:包含解锁方式的容器,如图案、PIN、密码等。
- KeyguardPatternView、KeyguardPINView、KeyguardPasswordView:这些类分别对应不同的解锁方式,它们实现了用户与锁屏界面的交互。
- 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
方法具体解释如下:
-
组件管理:
putComponent
方法通常是一个用于注册组件的工具方法。它将当前的KeyguardViewMediator
实例存储在一个全局或共享的组件容器中,使得其他类或模块可以通过这个容器来获取这个实例。 -
依赖注入:这种做法类似于依赖注入(Dependency Injection),允许系统中的其他部分在需要时获取
KeyguardViewMediator
的实例,而不需要直接创建它。这样可以减少类之间的耦合,提高代码的可维护性。 -
方便访问:通过将
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