View的绘制流程是从Activity的哪个生命周期方法开始执行的
这道题想考察什么?
考察同学对Activity的生命周期和View的绘制流程是否熟悉
考生应该如何回答
View的绘制流程是从Activity的 onResume 方法开始执行的。
首先我们找到 onResume 在哪儿执行的,代码如下:
// ActivityThread.java
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) {
// 1 执行 onResume 流程
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
// 2 执行 View 的流程
wm.addView(decor, l);
}
由上面1代码进入,我们继续跟进:
public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
String reason) {
r.activity.performResume(r.startsNotResumed, reason);
}
// Activity.java
final void performResume(boolean followedByPause, String reason) {
mInstrumentation.callActivityOnResume(this);
}
public void callActivityOnResume(Activity activity) {
activity.onResume();
}
到这儿我们就找到了onResume方法的执行位置。而View的绘制就是由2代码进入:wm.addView
中的wm 就是 WindowManager,但是WindowManger是一个接口,实际调用的是 WindowManagerImpl 的 addView 方法
// WindowManagerImpl.java
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,
mContext.getUserId());
}
mGlobal 是 WindowManagerGlobal 对象
// WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView, userId);
}
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
int userId) {
requestLayout();
}
到这儿我们可以看到,通过 requestLayout 开始绘制 View。
所以通过以上分析可以知道,在调用了 onResume 生命周期方法后,开始执行 View 的绘制。
最后
有需要以上面试题的朋友可以关注一下哇哇,以上都可以分享!!!
网友评论