文章目录
- [Android ViewRootImpl源码分析](#Android ViewRootImpl源码分析)
Android ViewRootImpl源码分析
概述
ViewRootImpl 是连接 View 层和 WindowManagerServcie(WMS) 的桥梁。
作用:
- 负责管理整个 View 树的布局、测量、绘制流程
- 负责与 WMS 通信,完成窗口的添加、更新、移除
- 调度 InputEventReceiver,处理输入事件、焦点变化等。
流程
ActivityThread.handleLaunchActivity():
- Instrumentation.newActivity()
- Instrumentation.callActivityOnCreate()
- Activity.performCreate()
- Activity.onCreate()
- Activity.setContentView()
ActivityThread.handleResumeActivity():
- ActivityThread.performResumeActivity():
- Activity.performResume()
- Instrumentation.callActivityOnResume()
- Activity.onResume()
- Activity.makeVisible():
- WindowManagerImpl.addView()
- WindowManagerGlobal.addView():创建ViewRootImpl实例,并关联ViewRootImpl和DecorView
- ViewRootImpl.setView()
- ViewRootImpl.requestLayout()
- ViewRootImpl.scheduleTraversals()
- ViewRootImpl.doTraversal()
- ViewRootImpl.performTraversals()
- ViewRootImpl.performMeasure():测量流程
- ViewRootImpl.performLayout():布局流程
- ViewRootImpl.performDraw():绘制流程
源码分析
ActivityThread.handleResumeActivity()
java
public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
boolean isForward, boolean shouldSendCompatFakeFocus, String reason) {
// Activity的状态由可见转变为可见可交互
// 依次调用:ActivityThread.performResumeActivity() → Activity.performResume() → Instrumentation.callActivityOnResume() → Activity.onResume()
if (!performResumeActivity(r, finalStateRequest, reason)) {
return;
}
// 调用Activity.makeVisible()
r.activity.makeVisible();
}
Activity.makeVisible()
java
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
// 代理转发,实际由WindowManagerImpl处理,并传入DecorView
wm.addView(mDecor, getWindow().getAttributes());
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);
}
WindowManagerImpl.addView()
java
@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyTokens(params);
// 调用WindowManagerGlobal.addView()
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,
mContext.getUserId());
}
WindowManagerGlobal.addView()
java
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {
final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;
ViewRootImpl root;
View panelParentView = null;
synchronized (mLock) {
// 创建ViewRootImple实例
if (windowlessSession == null) {
root = new ViewRootImpl(view.getContext(), display);
} else {
root = new ViewRootImpl(view.getContext(), display,
windowlessSession, new WindowlessWindowLayout());
}
// DecorView设置布局参数
view.setLayoutParams(wparams);
// ViewRootImple关联DecorView
root.setView(view, wparams, panelParentView, userId);
}
}
ViewRootImpl.setView()
java
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
int userId) {
synchronized (this) {
if (mView == null) {
// 保存DecorView
mView = view;
// 请求布局
requestLayout();
// 通过IBinder向WMS申请窗口和画布
res = mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(), userId,
mInsetsController.getRequestedVisibleTypes(), inputChannel, mTempInsets,
mTempControls, attachedFrame, compatScale);
// 绑定父子关系,将DecorView的父容器设置为ViewRootImpl
view.assignParent(this);
}
}
ViewRootImpl.requestLayout()
java
@Override
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
// 调度遍历流程
scheduleTraversals();
}
}
ViewRootImpl.scheduleTraversals()
java
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
// 插入同步屏障, 最终调用doTraversal()
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
notifyRendererOfFramePending();
pokeDrawLockIfNeeded();
}
}
final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
ViewRootImpl.doTraversal()
java
void doTraversal() {
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
// 绘制流程
performTraversals();
}
}
ViewRootImpl.performTraversals()
java
private void performTraversals() {
// 测量阶段
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
// 布局阶段
performLayout(lp, mWidth, mHeight);
// 绘制阶段
performDraw(mActiveSurfaceSyncGroup)
}