美文网首页
【Android面试题】高级UI面试题——View的绘制流程是从

【Android面试题】高级UI面试题——View的绘制流程是从

作者: 小城哇哇 | 来源:发表于2023-08-27 17:44 被阅读0次

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 的绘制。

最后

有需要以上面试题的朋友可以关注一下哇哇,以上都可以分享!!!

相关文章

网友评论

      本文标题:【Android面试题】高级UI面试题——View的绘制流程是从

      本文链接:https://www.haomeiwen.com/subject/dhuwmdtx.html