首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Activity.onCreate()中的setContentView()之后,Android什么时候会第一次调用View.onMeasure()?

在Activity.onCreate()中的setContentView()之后,Android会在下一次UI线程的循环中第一次调用View.onMeasure()。这是因为在Activity的生命周期中,setContentView()方法会将布局文件解析成View对象,并将其添加到Activity的视图层级中。但是,此时View还没有被测量,即还没有确定每个View的大小和位置。因此,Android会在下一次UI线程的循环中进行测量操作,即调用View.onMeasure()方法来测量每个View的大小和位置。这样才能确保在后续的布局和绘制过程中,每个View都能正确地显示在屏幕上。

在调用View.onMeasure()之后,Android会根据测量结果进行布局和绘制操作。首先,会调用View.onLayout()方法来确定每个View的位置。然后,会调用View.onDraw()方法来绘制每个View的内容。

需要注意的是,如果在Activity.onCreate()中使用了自定义的View,并且该View重写了onMeasure()方法,那么第一次调用View.onMeasure()会在setContentView()之后立即发生。这是因为自定义View的测量过程需要在布局解析之前完成。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android之自定义View死亡三部曲之Measure

我们在上一章节Android之View诞生之谜中分析了系统从启动actiivty到调用setContentView加载我们xml布局文件,但是此时我们View是不可见,因为我们还没有对其进行如下操作...,美美地出场—-绘制操作 OK,我们在上篇中分析道,系统加载好布局资源之后触发ViewRootImplperformTraversals方法,该方法内部会开始执行测量、布局、绘制工作,也就是我们死亡三部曲开始...补充:Android Touch事件分发机制详解之由点击引发战争我们分析过DecorView实际是集成自FrameLayout,那么我们看frameLayout,发现frameLayout并没有measure...从上面我们看到,里面调用了onMeasure方法,这里要注意了: 我们ViewGroup并没有重写ViewonMeasure方法,而但是我们android开发四大布局 FrameLayout、LinearLayout...至此,View三围已经测出来了,本篇略长,测量android死亡三部曲是第一部,也是里面最复杂、重要一部,快看下你三围是多少吧!

35330

❤️Android 性能优化之启动优化❤️

之后,应用程序生成主线程,也称为UI线程,并将创建主Activity任务交给它。 创建Activity 应用进程创建你Activity后,Activity执行以下操作: 初始化值。...调用构造函数。 调用 Activity 当前生命周期状态回调方法,如 Activity.onCreate()。...查询启动时间 初始显示时间(Time to initial display) Android 4.4(API 级别 19)及更高版本,logcat 包含一个输出行,其中包含一个名为 Displayed...第一次绘制你应用程序。...应用程序执行延迟加载情况下,这可能很有价值。延迟加载,应用程序不会阻止窗口初始绘制,而是异步加载资源并更新视图层次结构。 这里我Activity.onCreate()中加了个工作线程。

83860

实现杂记(27):解决onCreate()过程获取Viewwidth和Height为04种方法

PS:这个文章是站在巨人肩膀上抄袭,之所以再次写,我是想分析:到底是什么时候拿到宽高 下面的三种方法都经过实际测试,都是可以用,输出结果如下: ?...从这个结果可以看出,都是onResume之后才开始拿到这值, 使用  onLayout()方法得到结果,会在第一次输出,当然这个函数执行很多次,例如后面的又输出来一次, 其中subview输出是将...Width 也是onResume之后输出, 也就是说:我们想拿到宽和高,都是onResume这个周期之后才可以拿, 其实也就是layout之后才拿到 关于该代码工程包等我下次更新时候上传...setContentView()被调用后,事件队列中会包含一个要求重新layoutmessage,所以任何你post到队列东西都会在Layout发生变化后执行。...onLayout方法会调用很多次,所以要考虑好在这个方法要做什么,或者第一次执行后禁用掉你代码。

1.4K20

金九银十Android面试复习题集:关于四大组件Activity你了解多少?

onDestroy() 这个方法Activity被销毁之前调用之后Activity状态将变为销毁状态。...Activity onResume 之后才显示原因是什么? 虽然我们设置 Activity 布局一般都是 onCreate 方法里调用 setContentView 。...) 综上,onResume回调之后创建一个 ViewRootImpl ,有了它之后应用端就可以和 WMS 进行双向调用了。...只不过死循环阻塞了主线程,如果系统再有上述四种事件发生,就无法相应时间内处理从而触发 ANR。 onNewIntent是什么时候调用?...以上内容均放在了开源项目:【github】 已收录,里面包含不同方向自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新...

1.4K00

面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

不过如果我们代码手动调用 View.requestLayout,最终也走到这里,此时的当前线程就是调用线程,所以这也解释了为什么我们不能在非主线程更新 UI。一定不能在非主线程更新 UI 吗?... fork() 之后,父进程和子进程将并发执行相同代码。这意味着 fork() 系统调用在父进程和子进程中都会执行。fork() 返回值规则是为了让父进程和子进程能够区分自己角色。...父进程,fork() 返回新创建子进程进程 ID(PID);子进程,fork() 返回 0。... Android 系统,Zygote 进程充当了应用程序进程孵化器(incubator)。...创建之后,只需要保证创建 ViewRootImpl 线程和更新 UI 线程是同一个就可以;比如我们子线程调用 ViewManager#addView我们同上说子线程不可以更新 UI,这个异常是

22530

Android面试题集:以前烂大街四大组件-Activity,面试重提这些知识点你还记得吗?

onDestroy() 这个方法Activity被销毁之前调用之后Activity状态将变为销毁状态。...Activity onResume 之后才显示原因是什么? 虽然我们设置 Activity 布局一般都是 onCreate 方法里调用 setContentView 。...WMS 通过 mWindow (一个 Binder 对象) 调用应用端 mWindowSession.addToDisplay(mWindow) 综上,onResume回调之后创建一个 ViewRootImpl...只不过死循环阻塞了主线程,如果系统再有上述四种事件发生,就无法相应时间内处理从而触发 ANR。 onNewIntent是什么时候调用?...)收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息; 7、主线程收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法

68200

Android 手机从开机到 APP 启动经过流程

,是IPC一种;(但是Android中一般使用Binder来实现IPC,这里使用socket原因后面有写到) SS:Framework两大重要进程之一(另一个是Zygote),载着framework...当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中UI线程或者叫主线程。...从Activity创建成功到显示画面 onCreate()方法先执行setContentView()方法将对应xml文件传入,之后会去调用window.setContentView(),最终会在这里创建...开始onResume()阶段,开始向H类发送一个消息,然后ActivityThread获取之前创建Decorview并调用windowManager.add(),最后windowManager...先利用MeasureSpec完成onmeasure(),然后onlayout()确定各元素坐标,ondraw()负责将view画到canvas上,再通过Surface进行跨进程最终调用Native

1.6K40

Window源码解析(一):与DecorView那些事

Window 第一次出现在 Activity 视野,是 Activity attach 方法,具体代码如下: final void attach(Context context, ActivityThread...之后设置了回调,这样当 Window 接收到触摸或者按键等事件后,回调给 Activity 。 另外还给 Window 对象设置了窗口管理器,也就是我们经常用到 WindowManager 。...与DecorView那些事 开头中说到,Window 是用来负责管理 View 。 现在 Window 已经创建完毕了,那么到底什么时候与 View 发生了交集了呢?...我们总结一下, setContentView(int layoutResID) 主要就是这三件事: 创建 DecorView 视图对象; 将自定义视图 layout_main.xml 进行解析并添加到...installDecor() 调用了 generateDecor() 方法来创建 DecorView; 之后调用 generateLayout(mDecor) 来创建 mContentParent

44520

面试官灵魂发问:你真的懂 Context 吗?

面试官:ContextImpl 实例是什么时候生成 Activity onCreate 里能拿到这个实例吗 :这个都是系统处理,具体时机没有跟进去看。...面试官:好,回去等通知吧 ️ 坚持每天学习、不断提升自己,目前月薪 30k 面试官:ContextImpl 实例是什么时候生成 Activity onCreate 里能拿到这个实例吗 ️:...( contextImpl , application) 这个方法就把 Activity 和 Application 以及 ContextImpl 关联起来了,就是上面结论里说时机一样 最后调用 activity.onCreate...得出结论,ContentProvider Context 是 Applicaiton 创建之后,但是 onCreate 方法调用之前初始化Android进阶学习视频】、【全套Android...动态注册很简单,调用 Context.registerReceiver 动态注册 BroadcastReceiver 时,会生成一个 ReceiverDispatcher 持有这个 Context

1.5K11

《Activity显示界面历险记》

前言 Activity显示View过程,有一些重要角色总让人理不清,比如PhoneWindow、DecorView、ViewRootImpl。 也常常有面试题问到,他们四者之间关系?...加载布局文件(DecorView) 有了窗管家之后,就可以继续onCreate方法了,onCreate方法中最重要就是这个setContentView方法。...再回到上面的setContentView方法调用installDecor方法创建了小弟之后,还做了一件事: //加载xml布局文件 mLayoutInflater.inflate(layoutResID...小薇是什么时候创建呢? 接着看Activity调用过程,onCreate调用完后,就会调用onResume方法,这又要从handleResumeActivity方法说起了。...ViewRootImpl,创建于handleResumeActivity方法,最后通过addView被创建。 View第一次绘制发生在什么时候

47420

线程与更新UI,细谈原理

进入正题,大家应该都听过这样一句话——“UI更新要在主线程,子线程更新UI崩溃”。久而久之就感觉这是个真理,甚至被认为是“官方结论”。 但是如果问你,官方什么时候在哪里说过这句话,你会不会有点懵。...2)onResume方法之后新建一个ViewRootImpl,作为DecorViewparent对DecorView进行测量,布局和绘制等操作。...ViewRootImpl创建是onResume之后。...setText方法调用了TextViewsetText()方法,然后由于ToastTextView宽高都是wrap_content,所以触发requestLayout方法,最后会调用到最上层...所以崩溃原因就是因为Toast第一次子线程show时候,新建了一个ViewRootImpl实例,绑定了当前线程也就是子线程到mThread变量。

78120

APP 为何启动那么慢?

App启动方式 ---- 冷启动(Cold start) 冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后再次启动。...调用startActivity,该方法经过层层调用,最终会调用ActivityStackSupervisor.javastartSpecificActivityLocked,当activity所属进程还没启动情况下...此时,系统进程交换应用程序启动窗口,允许用户开始与应用程序进行交互。如果应用程序重载了Application.onCreate(),系统会调用onCreate()方法。...当用户点击你app那一刻到系统调用Activity.onCreate()之间这个时间段内,WindowManager先加载app主题样式windowBackground做为app预览元素,然后再真正去加载...解决方案 1.甩锅给系统 使用透明主题: true Activity.onCreate()之前App不做显示

1.8K20

Android之View诞生之谜

Activity布局文件是如何被加载? 我们activity视图是什么时候被加载呢?...我们接着看 getWindow().setContentView(layoutResID); 渲染我们布局文件前,先调用了installDecor()来初始化mContentParent,之前也说mContentParent...其实要想知道什么时候开始执行测量等工作,我们可以看下ActivityThread源码,ActivityThread是android用来管理activity,这家伙知道肯定多一些。...首先ActivityThread通过调用handleLaunchActivity启动我们目标activity 也就是说performLaunchActivity调用之后,activityonCreate...作为绘制view入口,我们来看下requestLayout方法 ViewRootImpl.scheduleTraversals()调用后,系统会发起一个异步消息,然后异步消息执行过程调用performTraversals

36630

面试官:View.post() 为什么能够获取到 View 宽高?

[9] 说一些题外话,Android 面试进阶指南 其实是我小专栏维护一个付费专栏,且已经有部分付费用户。本文是第九篇文章了,为了维护付费用户权益,没有办法把所有文章都同步到公众号。...从日志打印顺序可以看出来,View.post() 回调打印语句是最后执行。 抛开代码来思考一下这个问题,什么时候可以获取到 View 宽高?...创建 WindowManagerGlobal.addView() 是 ActivityThread handleResumeActivity() 调用,但是是 Activity.onResume...从日志打印顺序可以看出来,View.post() 回调打印语句是最后执行。 抛开代码来思考一下这个问题,什么时候可以获取到 View 宽高?...创建 WindowManagerGlobal.addView() 是 ActivityThread handleResumeActivity() 调用,但是是 Activity.onResume

1.2K30
领券