返回

深入了解 SystemUI —— 一探 recents 启动流程之真谛(第一部分)

Android

剖析 SystemUI 启动流程:踏上揭秘之旅(第一部分)

PhoneWindowManager —— 探索点击事件的分发奥秘

让我们从 PhoneWindowManager 开启我们的旅程,它负责协调各种窗口的管理和交互,同时也是点击事件分发的关键参与者。

PhoneWindowManager 拦截点击事件:

PhoneWindowManager 处理点击事件的方法是 interceptKeyBeforeDispatching()。该方法首先判断点击事件是否位于状态栏区域,若是则调用 dispatchStatusBarKeyEvent() 进行处理。否则,会继续判断点击事件是否位于导航栏区域,若是则调用 dispatchNavigationBarKeyEvent() 进行处理。

获取 LocalServices:深入服务获取之谜

interceptKeyBeforeDispatching() 方法中,通过 LocalServices.getService() 获取了 WindowManagerInternal 接口的实例。WindowManagerInternal 是一个系统服务,提供对窗口管理器的内部 API 的访问。

LocalServices 是一个服务注册表,用于存储和检索系统服务。它是一个单例,由 ServiceManager 类管理。

那么,通过 LocalServices.getService() 是如何获取到 WindowManagerInternal 接口的实例的呢?其实,在 SystemServer 启动时,会将 WindowManagerInternal 接口的实例注册到 LocalServices 中。因此,interceptKeyBeforeDispatching() 方法可以通过 LocalServices.getService() 获取到 WindowManagerInternal 接口的实例。

WindowManagerInternal 接口的实例获取成功后,PhoneWindowManager 就可以调用其提供的 API 来进行窗口管理和交互了。

WindowManagerService:揭开窗口管理的序幕

WindowManagerService 是 Android 系统中负责窗口管理的核心服务,它管理着系统中所有窗口的生命周期和显示位置。

WindowManagerService 接收点击事件:

当 PhoneWindowManager 调用 WindowManagerInternal 接口的 dispatchPointerEvent() 方法时,实际上是将点击事件传递给了 WindowManagerService。

WindowManagerService 在收到点击事件后,会根据点击事件的位置和类型,决定将点击事件分发给哪个窗口。

WindowManagerService 分发点击事件:

WindowManagerService 会根据窗口的类型和层级,将点击事件分发给相应的窗口。

对于普通的应用程序窗口,WindowManagerService 会将点击事件分发给该窗口的 Window 对象。Window 对象会根据点击事件的位置和类型,决定将点击事件分发给哪个控件。

对于系统窗口,如状态栏和导航栏,WindowManagerService 会将点击事件分发给相应的系统组件。

以上就是本文对 SystemUI 启动流程的第一部分的介绍,希望对你有所帮助。后续文章中,我们将继续深入探索 SystemUI 启动流程的后续步骤,敬请期待!