android P 锁屏初探 ——2 开机显示锁屏界面的流程

it2022-05-05  128

第一次做流程图,做的不太规范,见谅,见谅。

具体的流程介绍,可以参看这篇文章。 Android8.1 SystemUI Keyguard之启动流程

有一点需要补充一下,系统首次开机是不显示锁屏界面的。 原因应该是下面部分:(KeyguardViewMediator.java) 中文是我自己的备注,结合源码的英文备注,应该没错。 =)

private void handleSystemReady() { synchronized (this) { if (DEBUG) Log.d(TAG, "onSystemReady"); mSystemReady = true; doKeyguardLocked(null); mUpdateMonitor.registerCallback(mUpdateCallback); } // Most services aren't available until the system reaches the ready state, so we // send it here when the device first boots. //第一次开机,跳过锁屏 maybeSendUserPresentBroadcast(); } private void maybeSendUserPresentBroadcast() { if (mSystemReady && mLockPatternUtils.isLockScreenDisabled( KeyguardUpdateMonitor.getCurrentUser())) { // Lock screen is disabled because the user has set the preference to "None". // In this case, send out ACTION_USER_PRESENT here instead of in // handleKeyguardDone() sendUserPresentBroadcast(); } else if (mSystemReady && shouldWaitForProvisioning()) { //这里跳过了锁屏 // Skipping the lockscreen because we're not yet provisioned, but we still need to // notify the StrongAuthTracker that it's now safe to run trust agents, in case the // user sets a credential later. getLockPatternUtils().userPresent(KeyguardUpdateMonitor.getCurrentUser()); } } /** * Enable the keyguard if the settings are appropriate. */ private void doKeyguardLocked(Bundle options) { if (KeyguardUpdateMonitor.CORE_APPS_ONLY) { // Don't show keyguard during half-booted cryptkeeper stage. if (DEBUG) Log.d(TAG, "doKeyguard: not showing because booting to cryptkeeper"); return; } // if another app is disabling us, don't show if (!mExternallyEnabled) { if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); // note: we *should* set mNeedToReshowWhenReenabled=true here, but that makes // for an occasional ugly flicker in this situation: // 1) receive a call with the screen on (no keyguard) or make a call // 2) screen times out // 3) user hits key to turn screen back on // instead, we reenable the keyguard when we know the screen is off and the call // ends (see the broadcast receiver below) // TODO: clean this up when we have better support at the window manager level // for apps that wish to be on top of the keyguard return; } // if the keyguard is already showing, don't bother if (mStatusBarKeyguardViewManager.isShowing()) { if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); resetStateLocked(); return; } // In split system user mode, we never unlock system user. if (!mustNotUnlockCurrentUser() || !mUpdateMonitor.isDeviceProvisioned()) { // if the setup wizard hasn't run yet, don't show final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim", false); final boolean absent = SubscriptionManager.isValidSubscriptionId( mUpdateMonitor.getNextSubIdForState(ABSENT)); final boolean disabled = SubscriptionManager.isValidSubscriptionId( mUpdateMonitor.getNextSubIdForState(IccCardConstants.State.PERM_DISABLED)); final boolean lockedOrMissing = mUpdateMonitor.isSimPinSecure() || ((absent || disabled) && requireSim); if (!lockedOrMissing && shouldWaitForProvisioning()) { //开机向导还没有运行,设备还没有配置好且sim卡也没有上锁或者没有sim卡。 if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned" + " and the sim is not locked or missing"); return; } boolean forceShow = options != null && options.getBoolean(OPTION_FORCE_SHOW, false); if (mLockPatternUtils.isLockScreenDisabled(KeyguardUpdateMonitor.getCurrentUser()) && !lockedOrMissing && !forceShow) { //用户关闭了锁屏功能 if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off"); return; } if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) { //Vold 相关的。外部设备加密解密相关 if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); // Without this, settings is not enabled until the lock screen first appears setShowingLocked(false, mAodShowing); hideLocked(); return; } } if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); showLocked(options); }

最新回复(0)