今天在看第三方开源框架使用设计模式的相关书籍是,发现有一些第三方框架内部使用到了onAttachedToWindow来做了很多文章。本文我们一起了解一下,onAttachedToWindow调用的时机。
什么时候被调用的?
我们先看一下方法说明
/**
* This is called when the view is attached to a window. At this point it
* has a Surface and will start drawing. Note that this function is
* guaranteed to be called before {@link #onDraw(android.graphics.Canvas)},
* however it may be called any time before the first onDraw -- including
* before or after {@link #onMeasure(int, int)}.
*
* @see #onDetachedFromWindow()
*/
@CallSuper
protected void onAttachedToWindow() {
}
由方法注释可知,这个方法的调用发生在attach to window,而且这时已经有surface,即将开始绘画。结合小编之前的Framework源码基础分析文章 and View源码解析文章综合可知,PhoneWindow和DecorView创建是在onCreate的setContentView时调用,window渲染本来就是在Activity的onResume之后(具体流程可以看小编之前的View源码分析系列文章),才调用的ViewRootImpl的performTraversals函数才会执行的。所以我们知道,这个是发生在onResume之后,具体通过一个简单的demo验证一下:
关于在Activity中什么时候调用onAttachedToWindow()和onDetachedFromWindow(),测试打了下log,发现onAttachedToWindow()在onResume()之后运行,onDetachedFromWindow()则在onDestory()之后才会调用
。
但是具体和onDraw、 onMeasure的先后顺序和时机,需要继续看注释说明。
由注释可知,这个方法会在第一次视图onMeasure之后、onDraw 之前调用时调用,从开发文档中我们可以看出,onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次。从开发文档中我们可以看出,onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次
。
常用来做什么?
1.在onAttachedToWindow中修改窗口尺寸,因为是在onMeasure之后调用,所以这是DecorView的LayoutParams都可以正常获取到,并且可以正常设置,而且最主要,只会调用一次
2.为什么不可以在onCreate中修改窗口尺寸,原因其实小编之前的文章 以及上面都已说过,onCreate时,只是各种视图的创建,还未进行视图渲染
3.在onAttachedToWindow可以注册广播,但是一般不建议这样使用哦
网友评论