对比Android 11, Android 13的SystemUI的源码文件目录,部分文件位置移动了或者删除了,其它的做出了很多改变,变的更加清晰、模块化...
代码里面注解用的频繁了. Dragger2是一个依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建.
Dragger2\](https://blog.csdn.net/qq_28898075/article/details/103145367) #### SystemUI初始化 \`\`\` frameworks\\base\\packages\\SystemUI\\src\\com\\android\\systemui\\statusbar\\phone\\CentralSurfacesImpl.java @Override public void start() { ... //statusBar相关,主要处理和信号有关的icon,比如mobile,wifi,vpn等 mStatusBarSignalPolicy.init(); ... createAndAddWindows(result);//入口,添加view的核心函数 ... //关于壁纸 if (mWallpaperSupported) { // Make sure we always have the most current wallpaper info. IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); mBroadcastDispatcher.registerReceiver(mWallpaperChangedReceiver, wallpaperChangedFilter, null /\* handler \*/, UserHandle.ALL); mWallpaperChangedReceiver.onReceive(mContext, null); } else if (DEBUG) { Log.v(TAG, "start(): no wallpaper service "); } // Set up the initial notification state. This needs to happen before CommandQueue.disable() //初始化通知栏状态 setUpPresenter(); ... // Lastly, call to the icon policy to install/update all the icons. //状态栏上wifi,BT 等状态图标的更新 mIconPolicy.init(); ... } @Override public void createAndAddWindows(@Nullable RegisterStatusBarResult result) { makeStatusBarView(result); mNotificationShadeWindowController.attach();//添加通知 mStatusBarWindowController.attach();//添加状态栏 } protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) { updateDisplaySize(); // populates mDisplayMetrics updateResources(); updateTheme(); inflateStatusBarWindow();//状态栏初始化 mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener()); mWallpaperController.setRootView(mNotificationShadeWindowView); ... createNavigationBar(result);//导航栏初始化 ... } protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { mNavigationBarController.createNavigationBars(true /\* includeDefaultDisplay \*/, result); } \`\`\` \[NavigationBar详解\](https://juejin.cn/post/7223216421199315000) 关于导航栏的创建,系统会判断屏幕大小来决定是否生成NavigationBar.如果屏幕过大导致判定为平板, 就会走Launcher3里面的/quickstep/taskbar 来替代导航栏. \`\`\` frameworks\\base\\packages\\SystemUI\\src\\com\\android\\systemui\\navigationbar\\NavigationBarController.java private boolean updateNavbarForTaskbar() { boolean taskbarShown = initializeTaskbarIfNecessary(); if (!taskbarShown \&\& mNavigationBars.get(mContext.getDisplayId()) == null) { createNavigationBar(mContext.getDisplay(), null, null); } return taskbarShown; } /\*\* 平板:true \*/ private boolean initializeTaskbarIfNecessary() { // Enable for tablet or (phone AND flag is set); assuming phone = !mIsTablet boolean taskbarEnabled = mIsTablet \|\| mFeatureFlags.isEnabled(Flags.HIDE_NAVBAR_WINDOW); if (taskbarEnabled) { //是平板,移除屏幕上的navBar removeNavigationBar(mContext.getDisplayId()); mTaskbarDelegate.init(mContext.getDisplayId()); } else { mTaskbarDelegate.destroy(); } return taskbarEnabled; } public void createNavigationBars(final boolean includeDefaultDisplay, RegisterStatusBarResult result) { updateAccessibilityButtonModeIfNeeded(); // Don't need to create nav bar on the default display if we initialize TaskBar. final boolean shouldCreateDefaultNavbar = includeDefaultDisplay \&\& !initializeTaskbarIfNecessary(); Display\[\] displays = mDisplayTracker.getAllDisplays(); for (Display display : displays) { if (shouldCreateDefaultNavbar \|\| display.getDisplayId() != mDisplayTracker.getDefaultDisplayId()) { createNavigationBar(display, null /\* savedState \*/, result); } } } @VisibleForTesting void createNavigationBar(Display display, Bundle savedState, RegisterStatusBarResult result) { ... //从这里分为两个部分 NavigationBar navBar = component.getNavigationBar();//导航栏实例化,navBar通过注解生成的 navBar.init();//将导航栏添加到屏幕上 mNavigationBars.put(displayId, navBar); ... } \`\`\` \`\`\` \