Bootstrap

Android SystemUI——基础简介(一)

        Android SystemUI 是 Android 操作系统的一部分,负责处理与用户界面相关的所有元素。它是 Android 设备上的一个关键组件,管理着屏幕顶部的状态栏(显示时间、信号强度、电池电量等)、屏幕底部的导航栏(返回、主页、最近的应用程序等按钮)、锁屏界面以及各种系统级别的交互和动画效果。

一、概述

        Android SystemUI 是指 Android 操作系统中的系统用户界面,它是用户与设备交互的界面。 SystemUI 提供了状态栏、导航栏、通知中心等重要的用户界面元素,这些元素可以帮助用户快速地访问设备的各种功能和信息。

1、发展历程

        以下是 Android SystemUI 的发展历程,以时间顺序排列:

时间段系统版本发展历程
2008年Android 1.0Android 初始版本没有状态栏,只有应用程序屏幕。
2009年 Android 1.5引入状态栏,但只有通知和电池指示器。
2010年Android 2.3状态栏加入了快捷设置面板。
2011年Android 4.0引入了新的状态栏,支持通知和快捷设置面板。
2013年Android 4.4状态栏和导航栏支持半透明效果。
2014年Android 5.0引入 Material Design,对状态栏和导航栏进行了全面更新。
2016年Android 7.0引入了快捷应用程序快捷方式,可从状态栏访问。
2019年Android 10.0状态栏和导航栏支持全面屏手势导航。
2020年Android 11.0加入了对新型折叠式设备的支持,如 Galaxy Z Fold2。
2021年Android 12.0引入了 Material You 设计语言,使状态栏和导航栏更加自适应。
2022年Android 13.0沿用了 Material You 设计语言,加入了一些细节。
2023年Android 14.0继续深化 Material You 设计语言的应用,旨在提升用户体验、增强安全性以及优化系统性能。
2024年Android 15.0针对新型折叠屏设备和平板电脑进行了专门优化,增强了对 AR 和 VR 应用的支持。

        Android SystemUI 作为 Android 系统的重要组成部分,随着 Android 系统的版本升级,不断进行着更新和优化,为用户提供更好的使用体验。 

2、主要功能 

        以下是 Android SystemUI 的主要功能的介绍:

功能描述
通知管理管理接收、显示和处理来自应用程序的通知信息。
快捷设置快速访问和调整常用系统设置,如无线网络、蓝牙、屏幕亮度等。
导航操作提供返回、主页和最近任务按钮,用于应用程序之间的导航。
锁屏界面显示时间、日期、天气信息和通知等功能的界面。
状态栏控制显示状态栏图标、提供系统信息和快速设置入口。
导航栏控制提供导航栏按钮,如返回、主页和最近任务按钮。
通知栏显示来自应用程序的通知信息,允许用户进行操作和管理。
锁屏通知在锁屏界面上显示通知信息,提供快速查看和操作的能力。
媒体控制在通知栏中显示媒体播放器控制按钮,方便用户控制音乐和视频播放。
快捷启动器提供快速启动应用程序的功能。
系统 UI 调节器提供隐藏的设置菜单,允许用户自定义系统UI的一些功能和外观。

        Android SystemUI 的主要功能涵盖了通知管理、快捷设置、导航操作、锁屏界面、状态栏控制等方面,为用户提供了方便的操作和管理界面。 

3、主要组件 

  • NavigationBar(导航栏):NavigationBar 是位于屏幕底部的导航界面,提供了返回、主页和最近任务等导航操作的按钮。它使用户能够浏览应用程序和系统功能,如切换应用、返回主屏幕等。
  • StatusBar(状态栏):StatusBar 是 Android SystemUI 的核心组件之一,位于屏幕顶部。它显示了通知图标、系统图标(如电池、信号强度、时间等)以及其他与系统状态相关的信息。
  • Notification Shade(通知面板):Notification Shade 是一个可下拉的面板,用户可以从任何屏幕位置向下滑动以展开它。它显示了来自各个应用程序的通知,并提供一些快速设置选项,如 Wi-Fi、蓝牙、飞行模式等。
  • LockScreen(锁屏界面):LockScreen 是 Android 设备的初始界面,显示了时间、日期、通知和快捷操作。用户可以在锁屏界面上查看和管理通知,以及执行一些快速操作,如解锁屏幕、调整音量等。
  • Quick Settings(快速设置):Quick Settings 是通知面板中的一部分,提供了一组常用的系统设置选项,用户可以通过快速切换按钮打开或关闭这些选项,例如调整屏幕亮度、打开/关闭无线网络等。
  • SystemUI Tuner(系统 UI 调节器):SystemUI Tuner 是一个隐藏的设置菜单,允许用户自定义和调整系统 UI 的某些功能和外观。用户可以通过 SystemUI Tuner 修改状态栏图标、导航栏按钮、通知行为等。
  • System Bars(系统栏):系统栏包括 StatusBar 和 NavigationBar,它们作为 Android 设备的固定元素,提供了对系统功能和导航的访问。系统栏的样式和行为可以根据不同设备和版本进行自定义。

4、未来发展

未来发展方向描述
用户个性化提供更多的定制选项,允许用户自定义界面样式、主题、动画效果等
增强的通知管理提供更智能的通知分类、自动整理和过滤功能,增强通知的交互和管理能力
手势导航进一步加强手势导航功能,提供更自然、直观的导航方式
智能化和上下文感知根据用户习惯和环境上下文,自动调整界面布局、显示相关快捷操作和通知
增强的互联功能加强与其他设备和平台的互联功能,如智能家居、车载系统等的集成
跨设备协同提供无缝切换和同步操作的能力,使用户在不同设备之间的体验更加一致
增强的安全和隐私提供更强大的身份验证和权限管理机制,保护用户数据和隐私

        随着技术的不断发展和用户需求的变化,Android SystemUI 未来有望在用户个性化、通知管理、手势导航、智能化、互联功能、跨设备协同以及安全和隐私方面实现更多的创新和改进。这些发展方向将进一步提升用户体验和系统功能,满足不断增长的用户期望和需求。

二、应用源码

        在 Android 系统中 SystemUI 其实就是一个系统级的 APP,通常位于 /system/priv-app/ 目录下,表明它是一个拥有特权权限的应用程序。这个路径也意味着它是系统镜像的一部分,不是普通的用户安装的应用。由 system_server 进程启动。SystemUI 本身不属于 system_server 进程,它是一个独立的进程。它的 HMI 包括了状态栏、导航栏、通知栏、锁屏、近期任务等等。

源码位置:/frameworks/base/packages/SystemUI/

1、核心代码

        SystemUI 组件中包括了很多核心服务,如 StatusBar、Notification、Recents、Screenshot、Keyguard 等等,这些服务都是由 SystemUIApplication 启动并管理的。在阅读 SystemUI 源代码时需要对这些服务进行一一了解和分析。

StatusBar

        StatusBar 是 Android 系统中的状态栏,展示了当前时间、电量、网络等信息,为用户提供了即时的信息反馈。StatusBar 由多个 View 和 Layout 组成,可以通过布局文件和代码进行设置和管理。

        在源码项目里,StatusBar 相关的类主要可以分为以下几种: 

  • SystemUI:定义了 StatusBar 基础功能,如添加/删除 View、刷新状态等。是 Android 系统用户界面(System UI)的核心组件之一,包含了启动和初始化这些 UI 组件的逻辑,是整个 SystemUI 模块的入口点。
  • StatusBar:继承自 SystemUI,是处理手机设备上状态栏行为的具体实现。管理了状态栏的显示逻辑,包括响应用户交互(如滑动展开通知栏)、更新图标和文本,以及与系统的其他部分进行通信。对于不同的设备形态(例如平板电脑或可折叠设备),可能会有不同路径下的类似实现来适应特定的布局和交互方式。
  • StatusBarManagerService:为 Android 系统提供 StatusBar 的管理服务,是一个系统服务,它提供了 API 给应用程序用来控制状态栏的行为。主要负责接收来自应用程序的通知请求,并将这些通知展示在适当的位置,如状态栏或锁屏界面上。此外,它还处理诸如扩展或收缩状态栏、调整其可见性等操作。该服务也涉及到与安全性和权限相关的逻辑,以确保只有具有适当权限的应用程序才能修改状态栏的内容或行为。
  • StatusBarWindowView:状态栏窗口的核心视图容器,它承载了状态栏的所有 UI 元素,并且是用户与状态栏进行交互的主要界面。此视图不仅展示了常规的状态栏内容,还处理了状态栏的展开和收起操作,例如当用户从屏幕顶部向下滑动以查看通知或快捷设置时。

         其中 SystemUI、StatusBar、StatusBarManagerService 和 StatusBarWindowView 所在 Android 源码中的位置如下:

  • /frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI.java
  • /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
  • /frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java

NavigationBar 

源码位置:/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java

        NavigationBar 是 Android 系统中的导航栏,展示了返回(Back)、主页(Home)、最近任务(Recents)等按钮,为用户提供了快捷的操作入口。NavigationBar 由多个 View 和 Layout 组成,可以通过布局文件和代码进行设置和管理,和 StatusBar 类似。

        NavigationBar 负责创建和管理 Android 设备上的导航栏的一个类。导航栏对于用户的操作来说是非常重要的部分,在不同的 Android 版本中,这个类可能会有不同的实现方式,特别是在引入手势导航后,其内部逻辑变得更加复杂。 

Notification 

        Notification 是 Android 系统中通知的实现方式,展示了各种应用程序的消息、提醒等,为用户提供了及时的信息反馈。Notification 由多个 View 和 Layout 组成,可以通过布局文件和代码进行设置和管理。

        在源码项目里,Notification 相关的类主要可以分为以下几种:

  • NotificationManagerService:为 Android 系统提供 Notification 的管理服务,是 Android 系统通知机制的核心服务之一。它负责管理和分发应用程序的通知到系统的适当位置,如状态栏或锁屏。NotificationManagerService 还提供了 API 给其他应用程序使用,以便它们可以创建、更新或取消通知。此外,它也处理了与用户设置相关的通知行为,比如静音模式、优先级打断规则等。
  • NotificationPanelView:是状态栏下拉通知面板的主要视图容器。它包含并管理所有与通知有关的UI元素,包括但不限于通知列表、快捷设置(Quick Settings)开关等。这个类处理了展开和收起通知面板的动画效果,并提供了对通知区域内的交互支持,比如滚动、点击通知以打开关联的应用或执行直接回复等功能。此外,它还可能涉及一些手势识别逻辑,用以响应用户的滑动手势来控制通知面板的行为。
  • NotificationContentView:是单个通知项的具体视图实现,它是构成整个通知列表的基本单元之一。每个通知条目都由一个 NotificationContentView 实例表示,负责展示来自应用的通知信息,如图标、标题、文本内容等。此视图还包括了诸如清除按钮、扩展/折叠按钮等交互控件。NotificationContentView 还可能包含了对通知内容的自定义样式支持,允许开发者通过远程视图(RemoteViews)或者更高级的通知模板来自定义通知外观。该类也处理了与通知内容相关联的操作事件,例如点击通知时触发的动作。
  • NotificationStackScrollLayout:是通知面板中用于展示所有通知的核心容器。它以一种堆栈的方式排列通知项,让用户可以通过滚动来浏览所有未读或已读的通知。该布局还支持展开和收起单个通知详情,以及执行如清除、滑动移除等操作。

        其中 NotificationManagerService、NotificationPanelView、NotificationContentView 和 NotificationStackScrollLayout 所在 Android 源码中的位置如下:

  • /frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
  • /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
  • /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java

QuickSettings

        QuickSettings 是 Android 系统中的快速设置面板,展示了各种应用程序的设置、开关等,为用户提供了快速的操作入口。QuickSettings 由多个 View 和 Layout 组成,可以通过布局文件和代码进行设置和管理。

        在源码项目里,QuickSettings 相关的类主要可以分为以下几种: 

  • QSPanel:定义了 QuickSettings 的显示和管理方式,是管理和显示快捷设置面板的主要组件,包括手势滑动、划出/隐藏等操作。这个面板通常可以通过从屏幕顶部向下滑动来访问,它包含了一系列可以快速切换设备设置或启动常用功能的开关和图标。QSPanel 负责加载和管理这些快捷设置项,并处理用户与这些项之间的交互。此外,它还实现了动画效果、布局调整以及响应不同的设备配置变化(例如横屏模式或不同的屏幕尺寸)。它作为快捷设置的容器,提供了整体的视觉结构和用户体验。
  • QSTileView:定义了 QuickSettings 中每个按钮的样式和显示方式,包括图标、文本、状态等元素的排版和显示。是每个单独的快捷设置项(也称为Tile)的具体视图实现。它是用户界面中代表快捷设置项的可视化元素,比如Wi-Fi、蓝牙、飞行模式等。QSTileView 负责绘制快捷设置项的图标和标签,并处理用户的点击事件以触发相应的操作。这个类可能还会支持更复杂的交互,如长按显示更多信息或者拖拽重新排列快捷设置项的位置。QSTileView 为开发者提供了一种标准化的方式来展示和操作快捷设置项。
  • QSTile:定义了 QuickSettings 中每个按钮的基本属性和功能,包括开关、状态等操作。它不直接处理 UI 渲染,而是作为业务逻辑层的一部分,决定了快捷设置项如何响应用户输入、更新状态以及与其他系统服务进行通信。每个快捷设置项都有一个对应的 QSTile 实例,该实例包含了控制特定设置或功能的所有必要方法和属性。例如,对于Wi-Fi快捷设置项,QSTile 可能会包含开启或关闭 Wi-Fi 的方法,检查当前连接状态的功能等。QSTile 还能够监听系统广播和其他事件,以便及时更新自身的状态并在需要时通知其关联的 QSTileView 进行UI刷新。

        其中 QSPanelQSTileView和 QSTile所在 Android 源码中的位置如下:

  • /frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
  • /frameworks/base/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
  • /frameworks/base/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java

RecentsView 

源码位置:/packages/apps/Launcher3/quickstep/src/com/android/quickstep/views/RecentsView.java

        Android 系统中负责管理最近任务(Recent Tasks)界面的核心组件之一。是 Quickstep 启动器的一部分,它提供了最近任务的可视化列表,允许用户快速回到之前使用的应用或任务。当用户通过手势或按键调出最近任务界面时,RecentsView 负责显 示这些任务的缩略图和相关信息,并处理用户的交互动作,例如点击某个任务以返回到该应用,或者滑动移除某个任务。

KeyguardViewMediator

源码位置:/frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java

        Android 系统中负责锁屏(Keyguard)界面逻辑协调的核心组件之一。主要负责管理锁屏界面的状态转换、用户输入处理以及与系统其他部分的交互。它协调了锁屏界面上各种元素的行为,例如解锁动画、通知显示、时钟和日期等信息的呈现,并确保这些元素根据设备的安全策略(如密码、图案或指纹认证)正确地响应用户的操作。

2、Launcher

        Launcher(启动器)并不属于 SystemUI 的一部分。尽管它们都是 Android 系统用户界面的重要组件,但它们是两个独立的模块,各自负责不同的功能。 

  • SystemUI:Android 系统的一个核心应用程序,它提供了系统级别的用户界面元素,包括状态栏(Status Bar)、导航栏(Navigation Bar)、锁屏(Lock Screen)、快捷设置面板(Quick Settings Panel)等。SystemUI 是设备上所有非应用程序特定 UI 元素的主要容器,确保了这些元素在不同应用之间的一致性和功能性。

  • Launcher:相比之下,Launcher 是 Android 设备的主屏幕和应用程序抽屉背后的实现。它是用户与设备交互的第一个界面,允许用户浏览已安装的应用程序、创建和管理桌面图标和小部件,并且可以自定义主屏幕布局。每个 Android 设备通常会预装一个默认的 Launcher,但用户也可以选择安装第三方 Launcher 来个性化他们的体验。

        虽然两者都对用户的整体体验至关重要,但它们是由不同的代码库维护,并且有不同的开发团队负责。SystemUI 更关注于提供一致的系统级 UI 组件和服务,而 Launcher 则专注于为用户提供一个个性化的应用程序启动和组织环境。此外,在某些定制 ROM 或厂商修改版本中,可能会有更紧密的集成或共享一些资源,但从架构上看,它们仍然是分离的组件。

;