新年好呀,新的一年做点什么呢?就梳理一下Android底层源码吧。先从窗口机制开始吧,目录如下:
Android 窗口机制 SDK31源码分析 总目录
- 初识
- DecorView与SubDecor的创建加载
- Window与Window Manager的创建加载
- ViewRootImpl的创建以及视图真正加载
- ViewRootImpl的事件分发
- 一定要在主线程才可以更新UI吗?为什么?
- Activity的Token和Dialog的关系
- Toast机制 - 封装可以在任何线程调用的toast
- 总结
初识🙆♀️
接下来的几篇文章会详细的介绍窗口加载过程,本篇文章整体介绍Android 窗口类整体结构关系图。
窗口结构图😎
好像和大家平时看到的窗口架构图不一太一样是吧,因为我看到sdk31的源码里,setContentView
会委托给AppCompatDelegateImpl
的setContentView
进行处理。而在AppCompatDelegateImpl
的setContentView
方法里面,额外添加了一层SubDecor
。这一块大家可以先看看,之后都会进行详细的源码分析。
概念说明介绍😎
这里大概介绍一下后续进行源码分析时涉及到的相关类以及作用
-
PhoneWindow
每个Activity都会持有一个Window的实例,而这个实例具体的实现类就是PhoneWindow;
PhoneWindow内部持有WindowManager以及DecorView
-
DecorView
DecorView继承自FramLayout,是当前Activity视图树的最顶层,它的作用是加载布局,被PhoneWindow持有。
-
ViewManager
ViewManager是activity中用来添加和移除View的接口,提供
addView
、updateViewLayout
、removeView
几个方法。 -
WindowManager
它继承自ViewManager,也是一个接口。所以它具备添加、删除和更新View。
WindowManagerImpl继承自WindowManager,但是具体却委托给了WindowsManagerGlobal来进行实现。
所以具体的窗口管理功能是由WindowsManagerGlobal来进行的。
-
WindowManagerImpl
WindowManager的具体实现,内部持有了
mGlobal
成员变量。它是WindowManagerGlobal类型的单例对象,具体的窗口管理功能是由WindowManagerGlobal来进行。 -
WindowManagerGlobal
WindowManager具体的实现。内部包含重要的对象ViewRootImpl,ViewRootImpl作为
-
ViewRootImpl
ViewRootImpl 在 WindowManagerGlobal 调用 addView() 方法后初始化 ViewRootImpl。
ViewRootImpl除了执行我们熟知的performMeasure、performLayout、performDraw,另外它还执行事件分发,首先将事件分发到Activity。
上面对窗口机制相关做了概述,后续将依照定制的目录进行源码解析。
创作不易,如有帮助一键三连咯🙆♀️。欢迎技术探讨噢!