鎖屏UI界面
SystemUI啓動的時候啓動各個SERVICE,這些Service不是四大組件的service,這個SERVICE繼承SystemUI,實現了start()和onBootComplete方法.其中StatusBar加載了SystemUI幾乎全部的界面,其中包括鎖屏界面,
其中Bouncer是安全鎖屏界面,實現類是KeyguardBouncer
鎖屏加載
鎖屏加載KeyguardBouncer過程:
(1)SystemUIApplication啓動Statusbar,這裏通過createAndAddWindows加載主要的界面,然後調用startKeyguard
(2)在startKeyguard中,調用KeyguardViewMediator的registerStatusbar方法,KeyguardViewMediator是整個待機解/鎖屏業務的調度器,負責調度鎖屏界面的相關動作及查詢解鎖屏狀態,然後進入StatusBarKeyguardViewManager
(3)(4)StatusBarKeyguardViewManager管理KeyguardBouncer,KeyguardBouncer裏面是安全鎖界面,它把所有的鎖封裝起來,然後通過判斷當前是什麼鎖,然後把對應的鎖視圖顯示出來
(5)當滑動鎖屏,如果用戶設置了鎖屏,那麼就讓安全鎖屏界面顯示出來
(6)(7)(8)顯示鎖屏界面
(9)是PhoeWindowmamanegr通過binder調用到KeyguardViewMediator的,這裏不研究
第(1)步到第(9)步如圖所示
#### Step 1:
Statusbar.startKeyguard
@Override
public void start() {
....
createAndAddWindows();
....
startKeyguard();
}
protected void startKeyguard() {
....
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
getBouncerContainer(), mNotificationPanel, mFingerprintUnlockController);
....
}
public StatusBarWindowView getStatusBarWindow() {
return mStatusBarWindow;
}
這裏的getBouncerContainer()就是createAndAddWindows創建的View
Step 2:
KeyguardViewMediator.registerStatusbar
public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar,
ViewGroup container, NotificationPanelView panelView,
FingerprintUnlockController fingerprintUnlockController) {
mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container, panelView,
fingerprintUnlockController, mDismissCallbackRegistry);//1
return mStatusBarKeyguardViewManager;
}
private void setupLocked() {
mStatusBarKeyguardViewManager =
SystemUIFactory.getInstance().createStatusBarKeyguardViewManager(mContext,
mViewMediatorCallback, mLockPatternUtils);
}
1處的mStatusBarKeyguardViewManager對象是在setupLocked中創建的,mStatusBarKeyguardViewManager實例化的時候傳遞了mViewMediatorCallback的回調,監聽鎖屏事件,如解鎖成功
Step 3:
StatusBarKeyguardViewManager.registerStatusBar
public void registerStatusBar(StatusBar statusBar,
ViewGroup container,
NotificationPanelView notificationPanelView,
FingerprintUnlockController fingerprintUnlockController,
DismissCallbackRegistry dismissCallbackRegistry) {
mStatusBar = statusBar;
mContainer = container;
mFingerprintUnlockController = fingerprintUnlockController;
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry,
mExpansionCallback);//2
mContainer.addOnLayoutChangeListener(this::onContainerLayout);
mNotificationPanelView = notificationPanelView;
notificationPanelView.setExpansionListener(this::onPanelExpansionChanged);//3
}
2處這裏把創建KeyguardBouncer,KeyguardBouncer管理所有鎖屏類型,3處監聽notificationPanelView的狀態,當notificationPanelView滑動展開後,讓KeyguardBouncer把具體view顯示出來.
Step 6,7,8:
這裏就是顯示鎖屏VIew,KeyguardBouncer會根據具體的鎖屏類型把VIew加載出來.
inflateView加載Keyguard_host_view.xml
下面是KeyguardSecurityContainer的getSecurityView
4處根據當前的鎖屏類型獲取對應的視圖的layoutid,如圖7處,在5處判斷視圖是否已經過加載,沒有就重新加載,然後放到SercurityViewFlipper裏面,6處更新鎖屏.後面的操作就是增加監聽,然後KeyGuardMeditor對解鎖的操作的了.