Window 的添加过程
Window(或者说View) 是怎么添加到 Android 系统中然后展示给用户的?让我们来探索一下 Window 的添加过程。
Window 添加过程的入口方法
要探索添加的过程,必须先在源代码中找到添加 Window 的入口方法。
Window 的添加需要通过 WindowManager 的 addView
方法实现,但 WindowManager 是个接口,它的真正实现类是 WindowManagerImpl 类,但 WindowManagerImpl 也并没有直接实现对 Window 的添加、删除、更新操作,而是通过桥接模式将所有操作委托给 WindowManagerGlobal 去实现。最终会调用 WindowManagerGlobal 类的 addView
方法真正开启 View 的添加过程。
所有,Window 添加过程的真正入口方法实际上是 WindowManagerGlobal 类的 addView
方法。
Window 添加过程的主要流程
WindowManagerGlobal 的 addView
方法主要分为三大步:
1.检查参数 params 是否是 WindowManager.LayoutParams,如果不是说明参数不合法,则会抛出异常。
1 | public void addView(View view, ViewGroup.LayoutParams params, |
2.创建 ViewRootImpl,并将 View 添加到列表中。
1 | public void addView(View view, ViewGroup.LayoutParams params, |
3.通过 ViewRootImpl 的 setView
方法来添加更新界面并通过 IPC 的方式调用 WindowManagerService 的 addWindow
方法完成 Window 的添加过程。
1 | public void addView(View view, ViewGroup.LayoutParams params, |
那 ViewRootImpl 的setView
方法是如何实现界面的更新的呢?
setView
方法中会调用 requestLayout()
方法去完成异步刷新请求:
1 | "EmptyCatchBlock", "PointlessBooleanExpression"}) ({ |
我们再查看 requestLayout
方法的源码,看它干了什么:
1 |
|
可以看到,是调用了 scheduleTraversals
方法进行绘制,我们知道 scheduleTraversals
是 View 执行绘制过程的入口方法,该方法会经过测量、布局、绘制这三个过程把 View 绘制出来。
那 View 绘制出来以后是怎么通过IPC调用的方式添加到 Window 中的呢?
我们知道,WindowManager 是外界访问 Window 的入口,所以最终 WindowManager 会通过 IPC 的方式调用 WindowManagerService 的 addWindow
方法,这样一来, Window 的添加请求就交给了 WindowManagerService 来处理了,然后 WindowManagerService 会经过一系列的操作将 View 添加到 Window 中并展示出来。
作为应用层开发者来说,了解到这个程度个人觉得就可以了,没必要去深究 WindowManagerService 的实现细节,至于 WindowManagerService 是如何处理 Window 的添加请求的,感兴趣的读者可以去查看源码。
参考书籍:《Android 开发艺术探索》