说明
这篇文章的目的,主要是简单介绍下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是一一对应的。它们之间的关系和作用如下:
- Activity:Activity是Android应用程序的基本组成单元,它代表了一个用户界面屏幕。一个应用程序可以有多个Activity,它们之间通过Intent进行通信。Activity的主要作用是展示数据和与用户进行交互,它运行在应用程序进程中。
- Window:Window是Android应用程序中一个非常重要的概念,它代表了一个屏幕窗口,包含了所有的UI元素(如按钮、文本框等)。每个Activity都有一个窗口,这个窗口提供了一个画布(Canvas),应用程序可以在这个画布上绘制自己的界面。Window是一个抽象的概念,在APP进程中,它有实现类PhoneWindow。
- 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交互
}
- ViewRootImpl与Activity也是一一对应,这个类的作用主要是以下3点
- 完成与WMS的进程间交互。添加/删除通知到WMS;接收WMS变更通知;
- 接收触屏等事件,并以消息的形式通知到Activity
- 和SurfaceFlinger交互,将Activity中Canvas绘制的内容发给SurfaceFlinger进行显示
- Choreographer根据系统 Vsync事件回调,进行帧绘制的调度,包括 Input调度,Animation调度,Traversal调度,并通知GPU进行后续处理。 实际开发中,想要检测屏幕帧率,都是通过这个类的相关机制进行。
Server侧
SurfaceFlinger Vsync信号
- SurfaceFlinger是一个系统服务,用于将Clinet的绘制内容+窗口大小/位置等信息,综合处理,调用底层OpenGl绘制到屏幕上。
- Vsync信号是操作系统底层的一种机制,每隔16ms发出VSYNC信号,触发对UI进行渲染。