开机锁屏流程:
首先: 手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下:
WindowManagerService wm = null; ...
try {
wm.systemReady(); //调用WindowManagerService的systemReady()方法。
2.WindowManagerService.java
mPolicy.systemReady(); //调用PhoneWindowManager .java中的systemReady方法。
phoneWindowManager.java中:
mKeyguardMediator.onSystemReady(); //进行待机锁屏及解锁逻辑
3. KeyguardViewMediator.java
中的onSystemReady()方法中:
doKeyguardLocked();
中的showLocked()方法:
mShowKeyguardWakeLock.acquire(); //确保屏幕处于唤醒状态
Message msg = mHandler.obtainMessage(SHOW);
mHandler.sendMessage(msg);
发送异步消息:
执行handleShow(); 方法。
handleShow方法中调用:
mKeyguardViewManager.show();
在这个show方法中:
mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
这个createKeyguardView方法是调用的LockPatternKeyguardViewProperties.java中createKeyguardView方法:
c reateKeyguardView方法构建一个LockPatternKeyguardView();
4.LockPatternKeyguardView();
在这个构造方法中调用了keyguardScreenCallback()方法,
调用updateScreen(getInitialMode(), false); //getInitialMode获取是锁屏还是解锁界面
假如是解锁的话调用recreateUnlockScreen()方法,
这个方法中 addView(mUnlockScreen);//将UnlockScreen添进LockPatternKeyguardView
然后调用createUnlockScreenFor()方法,
在这个方法中里判断解锁方式。
其中的这个方法initializeBiometricUnlockView(unlockView);
用来初始化人脸解锁,
以上,LockScreen或者UnlockScreen就创建出来了,当然,只是创建了相应对象,还得再显示。
5.再次回到KeyguardViewManager类的show方法,在执行完该方法中的 的mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this)代码流程后,接着执行mKeyguardView.show(),即调 用KeyguardViewBase的实现类LockPatternKeyguardView的show方法,如下:
@Override
public void show() {
// Emulate activity life-cycle for both lock and unlock screen.
if (mLockScreen != null) {
((KeyguardScreen) mLockScreen).onResume();
}
if (mUnlockScreen != null) {
((KeyguardScreen) mUnlockScreen).onResume();
}
if (mBiometricUnlock != null && mSuppressBiometricUnlock) {
mBiometricUnlock.hide();
}
}
开机锁屏的大致流程就是这样了。