注:此文章的源码与理解基于 Android SDK 30
在Activity中显示画面:
DecorView:
它是显示体系的根View,我们的xml文件写的布局与DecorView形成了一个ViewTree结构。在执行DecorView.onDraw()时,就会一层一层往下绘制,从而绘制形成完成的页面。
ViewRootImpl:
它是View与WMS通信的桥梁,一个DecorView对应一个ViewRootImpl,DecorView在执行onDraw所需要的canvas(画布)就是它来提供的。
public final class ViewRootImpl implements ViewParent,
View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks {
// .....
private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,
boolean scalingRequired, Rect dirty, Rect surfaceInsets) {
// ....
final Canvas canvas;
canvas = mSurface.lockCanvas(dirty);
mView.draw(canvas); // mView 就是 DecorView
// ....
}
private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
boolean insetsPending) throws RemoteException {
// ....
// mWindowSession.relayout 通过ADIL与WMS通信
int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
(int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
mPendingMergedConfiguration, mSurfaceControl, mTempInsets);
if (mSurfaceControl.isValid()) {
mSurface.copyFrom(mSurfaceControl);
} else {
destroySurface();
}
// ....
}
// ....
}
WindowManagerService:
WindowManagerService是Android系统中的一个核心服务,负责管理系统中所有的窗口。它主要负责以下几项任务:
布局管理:管理系统中所有窗口的大小和位置,以及它们在屏幕上的显示顺序。
输入事件处理:处理来自设备的输入事件,如触摸事件,按键事件等。
渲染窗口:通过SurfaceFlinger服务与硬件绘图引擎进行交互,以在屏幕上渲染窗口。
管理窗口状态:管理窗口的状态,如是否可见,是否激活等。
通过WindowManagerService,应用可以请求创建和管理自己的窗口,并与系统的其他组件进行交互,以提供一个完整的用户界面体验。
SurfaceFlinger:
SurfaceFlinger 是 Android 操作系统中一个系统组件,负责合成最终显示在屏幕上的图像。它是图形管道的最后一步,将多个应用程序的输出结合成单个图像,显示在屏幕上。
SurfaceFlinger 作为显示子系统和设备上运行的应用程序之间的中间人。当应用程序想要在屏幕上显示内容时,它会创建一个“表面”,并将其传递给 SurfaceFlinger。SurfaceFlinger 负责将这些表面组合成最终的图像,并将其发送到显示系统以显示在屏幕上。