【Android面试题】高级UI面试题——View的绘制流程是从Activity的哪个生命周期方法开始执行的

166 阅读2分钟

那年我双手插兜,不知道面市场上什么叫对手👊👊
👀你想要的面试题这里都有👀
👍关注小小不迷路👍

4 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老皮
还能解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路