Android WindowManagerService

一、WindowManagerService介绍

WindowManagerService是Android系统中的一个系统服务,它负责管理和控制窗口的显示和操作。它是WindowManager的实现类,用于处理窗口的添加、删除和更新等操作。

WindowManagerService的主要职责包括:

  1. 窗口的添加和删除:WindowManagerService负责跟踪和管理所有的窗口,当应用程序请求添加一个新的窗口时,WindowManagerService会负责将该窗口添加到屏幕上,并在窗口不再需要时将其删除。

  2. 窗口的更新:当窗口的内容或属性发生变化时,WindowManagerService会负责更新窗口的显示,例如窗口的位置、大小、透明度等。

  3. 窗口的焦点管理:WindowManagerService负责管理窗口的焦点,确保用户可以正确地与窗口进行交互。

  4. 窗口的层级管理:WindowManagerService负责管理窗口的层级关系,确保窗口按照正确的顺序显示在屏幕上。

  5. 窗口的事件分发:WindowManagerService负责将用户的触摸事件、按键事件等分发给相应的窗口,以便窗口可以正确地响应用户的操作。

总之,WindowManagerService是Android系统中负责管理和控制窗口的重要组件,它通过与WindowManagerGlobal和其他相关组件的协作,实现了窗口的添加、删除、更新和事件分发等功能。

二、WindowManagerService相关类

WindowManagerService

负责管理和控制窗口的显示和操作

WindowManagerService文件路径:

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

WindowManagerService定义:

public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {}

StartingSurfaceController

StartingSurfaceController是一个类,它在Android系统中的WindowManagerService中起着重要的作用。它负责处理应用程序的启动过程中的启动画面(Splash Screen)的显示和管理。

StartingSurfaceController类中的createSplashScreenStartingSurface()方法用于创建启动画面的Surface,并将其添加到窗口管理器中。这个方法接收一个ActivityRecord对象作为参数,以及一些其他的参数,如应用程序的包名、主题、标签等。

在createSplashScreenStartingSurface()方法中,它会调用WindowManagerService中的mStartingSurfaceController对象的createSplashScreenStartingSurface()方法来创建启动画面的Surface。这个方法会根据传入的参数来创建一个StartingSurface对象,并将其返回。

StartingSurfaceController类的主要作用是管理应用程序启动过程中的启动画面,它负责创建和管理启动画面的Surface,并将其显示在屏幕上。这样可以提供更好的用户体验,让用户在应用程序启动过程中看到一个漂亮的启动画面。

StartingSurfaceController文件路径:

frameworks/base/services/core/java/com/android/server/vm/StartingSurfaceController.java

StartingSurfaceController定义:

public class StartingSurfaceController {
    private static final class DeferringStartingWindowRecord {}
    final class StartingSurface {}
}

WindowSurfaceController

WindowSurfaceController是Android系统中用于控制窗口表面的一个关键组件,它在SurfaceComposerClient和SurfaceFlinger之间起着重要的桥梁作用,负责管理和维护窗口表面的状态的属性,并向SurfaceFlinger服务发送通知和请求。WindowSurfaceController的作用主要包括:

  • 窗口表面状态管理:WindowSurfaceController类通过与SurfaceFlinger服务通信,不断更新窗口表面的状态,包括表面大小、位置、缩放比例、透明度等属性。同时,WindowSurfaceController还负责窗口表面状态发生改变时向SurfaceFlinger发送通知,以触发界面的刷新和重绘。

  • 窗口表面属性管理:WindowSurfaceController类还负责管理和维护窗口表面的其他属性,如缓冲区大小、格式、像素格式、内存映射等。开发人员可以使用WindowSurfaceController提供的接口函数来设置和控制这些属性,以实现复杂的图形效果和交互体验。

  • 异步提交:WindowSurfaceController类使用异步提交的方式,向SurfaceFlinger服务发送窗口表面状态的更改。这种方式可以避免CPU和GPU之间的资源竞争和冲突,提供了系统的效率和稳定性。

WindowSurfaceController代码位于:

frameworks/base/service/java/com/android/server/wm/WindowSurfaceController.java

WindowSurfaceController的定义:

class WindowSurfaceController {}

WindowContainer

Defines common functionality for classes that can hold windows directly or through their children in a hierarchy form.

窗口容器,定义类的通用功能,这些类可以直接或通过其子级在层次结构形式中保存窗口。

WindowContainer代码位于:

frameworks/base/service/java/com/android/server/wm/WindowContainer.java

WindowContainer的定义:

class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
        implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable,
        InsetsControlTarget {}

WindowState

WindowState类是WindowManagerService管理所有窗口的基本操作单元,每个WindowState对象都代表一个窗口。状态包括窗口的大小、位置和可见性等信息,并且包含此窗口的绘制表面的处理逻辑和其他相关资源。

每个WindowState类都与一个Surace对象管理,用于在屏幕上显示窗口内容。Surface对象是Android UI系统中最基本的对象之一,是由窗口管理器维护的,并且用于限制在屏幕上绘制窗口内容时的访问权限。通过Surface对象,窗口管理器可以设置或更新窗口的位置、大小和透明度等属性,还可以根据需求决定在哪里绘制窗口的内容。

WindowState还由一个LayoutParams属性,用于描述如何布局和显示显示窗口。包括窗口的大小、位置、透明度、z轴顺序、层级等信息,并可以根据需要进行更改以使窗口满足更改的需求。

WindowState代码位于:

frameworks/base/service/java/com/android/server/wm/WindowState.java

WindowState的定义:

public final class extends WindowContainer<WindowState> implements WindowManagerPolicy.WindowState{}

WindowStateAnimator

WindowStateAnimator类是WindowManagerService中处理WindowState窗口的转换动画。每一个WindowState对应一个WindowStateAnimator,用于管理WindowState窗口的动画状态和过渡效果,并确保所有动画的正确执行。

WindowStateAnimator内部持有了三个Animation对象,分别对应窗口的进入、退出和变换效果,这些Animator对象是用于控制视图的位置、大小和透明度等属性的,以便在屏幕上显示动画效果。其中,变换动画效果是指窗口缩放、移动或选择等效果,可以应用于多个状态。

WindowStateAnimator代码位于:

frameworks/base/service/java/com/android/server/wm/WindowStateAnimator.java

WindowStateAnimator的定义:

class WindowStateAnimator {}

WindowToken

代表一个窗口的标识符,用于唯一标识一个窗口。每个WindowToken都对应着一个具体的窗口,包含窗口的一些基本属性,如类型、标识等。

WindowToken代码位于:

frameworks/base/service/java/com/android/server/wm/WindowToken.java

WindowToken的定义:

class WindowToken extends WindowContainer<WindowState>{}

Session

wm.Session是Android系统中一个系统级别的服务组件,它负责管理和维护应用程序与系统窗口之间的通信和协作。wm.Session通常是在WindowManagerService组件中实现的,wm.Session提供了一系列接口,用于创建、更新、销毁窗口,以及获取窗口的位置、大小、状态等信息:

  • addToDisplay():将一个VIew添加到指定的Display中

  • remoe():从此Session中删除所有窗口并结束会话。

  • updateSurfacePosition():在此Session中更新SurfaceControl位置。

  • updateSurfaceSize():在此Session中更新SurfaceControl的大小。

  • relayout():重新布局一个窗口。

Session代码位于:

frameworks/base/service/java/com/android/server/wm/Session.java

Session的定义:

class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {}

InputMonitor

InputMonitor是一种用于监控输入事件的Windows管理器功能。它允许应用程序或系统组件监视和响应用户输入,例如键盘按键、鼠标移动和点击等。

通过使用wm InputMonitor,应用程序可以注册一个回调函数来处理输入事件。当用户执行输入操作时,系统会将相应的输入事件传递给注册的回调函数进行处理。这使得应用程序能够实时地获取和响应用户的输入。

InputMonitor代码位于:

frameworks/base/service/java/com/android/server/wm/InputMonitor.java

InputMonitor的定义:

final class InputMonitor {}

三、WindowManagerService相关流程分析

WindowManagerService addWindow流程分析

Android13 WindowManagerService addWindow流程分析-CSDN博客​​​​​​​

WindowManagerService relayoutWindow

Android13 WindowManagerService relayoutWindow流程分析-CSDN博客

WindowManagerService finishDrawingWindow流程分析

Android13 WindowManagerService finishDrawingWindow流程分析-CSDN博客

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值