Android UI体系简介

115 阅读3分钟

说明

这篇文章的目的,主要是简单介绍下Android UI体系下各角色的作用,每个角色并不准备展开细说。之前没了解过的同学,有个印象就行;已经学过的,也可以跟着一起过一遍,复习一下。

UI体系中的C/S架构,Client=Activity Server=WMS

classDiagram
class Activity {
    mWindow: Window
}
class WindowManagerService{
    mWindowMap: HashMap(IBinder, WindowState)
}
graph LR
Window<-->WindowState

在android开发中,有四大组件,其中Activity专用于页面显示。在android系统运行中,有个系统级的服务WindowManagerService(WMS),用于管理和控制各个应用窗体的显示。WMS管理的实际是Window对象,而一个Window与Activity是一一对应的。它们之间的关系和作用如下:

  1. Activity:Activity是Android应用程序的基本组成单元,它代表了一个用户界面屏幕。一个应用程序可以有多个Activity,它们之间通过Intent进行通信。Activity的主要作用是展示数据和与用户进行交互,它运行在应用程序进程中。
  2. Window:Window是Android应用程序中一个非常重要的概念,它代表了一个屏幕窗口,包含了所有的UI元素(如按钮、文本框等)。每个Activity都有一个窗口,这个窗口提供了一个画布(Canvas),应用程序可以在这个画布上绘制自己的界面。Window是一个抽象的概念,在APP进程中,它有实现类PhoneWindow。
  3. WindowManagerService(WMS):WMS是Android系统中的窗口管理器服务,它负责管理所有的窗口,包括Activity的窗口。WMS运行在SystemServer进程中,与ActivityManagerService一起构成了Android的核心服务。WMS的主要作用是管理窗口的布局和显示,当应用程序需要创建一个窗口时,它会通过WMS来请求一个窗口。WMS会根据应用程序的请求创建一个窗口,并将其添加到窗口列表中。当用户与窗口进行交互(如点击窗口中的按钮)时,WMS会将这个事件传递给相应的应用程序。WMS中的mWindowMap是所有窗口的集合,每个WindowState与Client的Window对应

Activity与Window和WindowManagerService之间的联系需要通过跨进程通信来实现。由于Activity运行在应用程序进程中,而WMS运行在SystemServer进程中,因此它们之间的通信需要使用Android系统提供的Binder通信方式。当应用程序需要创建一个窗口时,它会通过WMS来请求一个窗口。WMS会根据应用程序的请求创建一个窗口,并将其添加到窗口列表中。当用户与窗口进行交互时,WMS会将这个事件传递给相应的应用程序。

Client侧

ViewRootImpl Choreographer

classDiagram

class Activity {
    mWindowManager: WindowManagerImpl // 窗口管理
}
class WindowManagerImpl{
    mViewRootImpls: List // ViewRootImpl集合
}
class ViewRootImpl{
    mContext:Context; // activity引用
    mWindowSession:IWindowSession;// 与wms交互
    mSurface: Surface // 与surfaceFlinger交互
}
  1. ViewRootImpl与Activity也是一一对应,这个类的作用主要是以下3点
    • 完成与WMS的进程间交互。添加/删除通知到WMS;接收WMS变更通知;
    • 接收触屏等事件,并以消息的形式通知到Activity
    • 和SurfaceFlinger交互,将Activity中Canvas绘制的内容发给SurfaceFlinger进行显示
  2. Choreographer根据系统 Vsync事件回调,进行帧绘制的调度,包括 Input调度,Animation调度,Traversal调度,并通知GPU进行后续处理。 实际开发中,想要检测屏幕帧率,都是通过这个类的相关机制进行。

Server侧

SurfaceFlinger Vsync信号

  1. SurfaceFlinger是一个系统服务,用于将Clinet的绘制内容+窗口大小/位置等信息,综合处理,调用底层OpenGl绘制到屏幕上。
  2. Vsync信号是操作系统底层的一种机制,每隔16ms发出VSYNC信号,触发对UI进行渲染。