Android 8.0 SystemUI(三)——StatusBar

状态栏与导航栏的启动由StatusBar.start()完成

/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    @Override
    public void start() {
        mNetworkController = Dependency.get(NetworkController.class);
        mUserSwitcherController = Dependency.get(UserSwitcherController.class);
        mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
        mScreenLifecycle.addObserver(mScreenObserver);
        mWakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class);
        mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
        mBatteryController = Dependency.get(BatteryController.class);
        mAssistManager = Dependency.get(AssistManager.class);
        mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
        mOverlayManager = IOverlayManager.Stub.asInterface(
                ServiceManager.getService(Context.OVERLAY_SERVICE));
        mColorExtractor = Dependency.get(SysuiColorExtractor.class);
        mColorExtractor.addOnColorsChangedListener(this);
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mForegroundServiceController = Dependency.get(ForegroundServiceController.class);
        mDisplay = mWindowManager.getDefaultDisplay();
        updateDisplaySize();
	......
	//创建状态栏与导航栏的窗口
        createAndAddWindows();
	......
    }

跟踪createAndAddWindows():

/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    public void createAndAddWindows() {
        addStatusBarWindow();
    }
    private void addStatusBarWindow() {
        makeStatusBarView();
	//创建StatusBarWindowManager对象
        mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
        mRemoteInputController = new RemoteInputController(mHeadsUpManager);
	//调用它的add()函数为StatusBar创建窗口,包括窗口的大小、位置、是否透明等属性。getStatusBarHeight()为StatusBar的高度,由com.android.internal.R.dimen.status_bar_height确定
        mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
    }

先来分析makeStatusBarView()函数:

protected void makeStatusBarView() {
    final Context context = mContext;
	//获取屏幕参数
    updateDisplaySize(); // populates mDisplayMetrics
	//更新Panels资源数据,statusbar包含很多panel,在创建PhoneStatusBarView时需要更新panel数据
    updateResources();
    updateTheme();
    //引入StatusBarWindowView布局
    inflateStatusBarWindow(context);
 	//statusbarwindow
    mStatusBarWindow.setService(this);
	//设置触摸事件监听器
    mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
    // TODO: Deal with the ugliness that comes from having some of the statusbar broken out
    // into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.
    mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById(
            R.id.notification_panel);
    mStackScroller = (NotificationStackScrollLayout) mStatusBarWindow.findViewById(
            R.id.notification_stack_scroller);
    mNotificationPanel.setStatusBar(this);
    mNotificationPanel.setGroupManager(mGroupManager);
    mAboveShelfObserver = new AboveShelfObserver(mStackScroller);
    mAboveShelfObserver.setListener(mStatusBarWindow.findViewById(
            R.id.notification_container_parent));
    mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header);
    mNotificationIconAreaController = SystemUIFactory.getInstance()
            .createNotificationIconAreaController(context, this);
    inflateShelf();
    mNotificationIconAreaController.setupShelf(mNotificationShelf);
    Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController);
    FragmentHostManager.get(mStatusBarWindow)
            .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
                CollapsedStatusBarFragment statusBarFragment =
                        (CollapsedStatusBarFragment) fragment;
                statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
                mStatusBarView = (PhoneStatusBarView) fragment.getView();
                mStatusBarView.setBar(this);
                mStatusBarView.setPanel(mNotificationPanel);
                mStatusBarView.setScrimController(mScrimController);
                mStatusBarView.setBouncerShowing(mBouncerShowing);
                setAreThereNotifications();
                checkBarModes();
            }).getFragmentManager()
            .beginTransaction()
            .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),
                    CollapsedStatusBarFragment.TAG)
            .commit();
    mIconController = Dependency.get(StatusBarIconController.class);
	//通知样式
    mHeadsUpManager = new HeadsUpManager(context, mStatusBarWindow, mGroupManager);
    mHeadsUpManager.setBar(this);
    mHeadsUpManager.addListener(this);
    mHeadsUpManager.addListener(mNotificationPanel);
    mHeadsUpManager.addListener(mGroupManager);
    mHeadsUpManager.addListener(mVisualStabilityManager);
    mNotificationPanel.setHeadsUpManager(mHeadsUpManager);
    mNotificationData.setHeadsUpManager(mHeadsUpManager);
    mGroupManager.setHeadsUpManager(mHeadsUpManager);
    mHeadsUpManager.setVisualStabilityManager(mVisualStabilityManager);
    if (MULTIUSER_DEBUG) {
        mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById(
                R.id.header_debug_info);
        mNotificationPanelDebugText.setVisibility(View.VISIBLE);
    }
    try {
        boolean showNav = mWindowManagerService.hasNavigationBar();
        if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);
    //检查是否显示导航栏
        if (showNav) {
        	//引入导航栏navigationbarview的布局
            createNavigationBar();
        }
    } catch (RemoteException ex) {
        // no window manager? good luck with that
    }
	......
}

其中的inflateStatusBarWindow( )和createNavigationBar( )

protected void inflateStatusBarWindow(Context context) {
//引入StatusBarWindowView布局
    mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
            R.layout.super_status_bar, null);
}
protected void createNavigationBar() {
//引入导航栏navigationbarview的布局
    mNavigationBarView = NavigationBarFragment.create(mContext, (tag, fragment) -> {
        mNavigationBar = (NavigationBarFragment) fragment;
        if (mLightBarController != null) {
            mNavigationBar.setLightBarController(mLightBarController);
        }
        mNavigationBar.setCurrentSysuiVisibility(mSystemUiVisibility);
    });
}

关于状态栏布局

/frameworks/base/packages/SystemUI/res/layout/super_status_bar.xml



    
    
            
        
                   
        
    
    
    
        
    
     
    
    
        
    
    
    
              
    
        
    

关于status_bar布局:

/frameworks/base/packages/SystemUI/res/layout/status_bar.xml


    
    
        
    
        
        
        
        
        
            
        
            
                 
            
            
                 
            
        
    
    
    

关于system_icons布局:



    
    
        
    
    

	
    

statusIcons:
@layout/signal_cluster_view:

你可能感兴趣的:(Android系统)