美文网首页Android
onAttachedToWindow () 和 onDetach

onAttachedToWindow () 和 onDetach

作者: itbird01 | 来源:发表于2022-03-06 07:51 被阅读0次

今天在看第三方开源框架使用设计模式的相关书籍是,发现有一些第三方框架内部使用到了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可以注册广播,但是一般不建议这样使用哦

相关文章

网友评论

    本文标题:onAttachedToWindow () 和 onDetach

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