Android13 关于SystemUI更新/Nav Bar add volume button&&other button

对比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); ... } \`\`\` \`\`\` \

相关推荐
AirDroid_cn1 分钟前
手机上看的网页,怎样自动在荣耀 MagicOS 10 平板上接着打开?
android·智能手机·电脑·荣耀手机
帅次5 分钟前
WebView 并发初始化竞争风险分析
android·xml·flutter·kotlin·webview·androidx·dalvik
spencer_tseng10 分钟前
HTML5 - Android - IOS
android·ios·html·html5
游戏开发爱好者819 分钟前
iOS 开发进阶,用 SniffMaster 实现 iPhone 抓包深度分析
android·ios·小程序·https·uni-app·iphone·webview
华科易迅9 小时前
MybatisPlus增删改查操作
android·java·数据库
SHoM SSER9 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
黄林晴9 小时前
Android 17 取色器 API:无需权限,一行 Intent 跨应用取色
android
程序员陆业聪11 小时前
别再说 Flutter 是唯一选择了——KMP 正在悄悄抢走它的地盘
android
三少爷的鞋11 小时前
2026 已过 1/3:事豫则立,不预则废——关于架构、协程与边界的思考
android
冬奇Lab11 小时前
Android 15 音频子系统(八):Audio HAL 与硬件接口——音频数据的最后一公里
android·音视频开发·源码阅读