SystemUI鎖屏流程

鎖屏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)步如圖所示
Bluncer加載過程#### 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對解鎖的操作的了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章