View的生命周期
很多做了三四年开发的Android开发者,对Activity、Fragment、View的生命周期都说不清楚,更不用提组件化了,现在就写写View的生命周期。
1. View的生命周期如下图所示
View生命周期.pngAndroid中的View有两种构造方法被调用的情况
- 在View创建时调用
- 在Layout文件加载时被调用。
- onFinishInflte:当View及其子View从XML文件中加载完成时调用;
- onAttachedToWindow: 当前View被附加加到一个window上时被调用;
- onMeasure:计算当前View及其所有子View的尺寸大小时被调用;
- onSizeChanged: 当前View的尺寸变化时被调用;
- onLayout: 当前View需要为其子View分配尺寸和位置时被调用;
- onDraw: 绘制View呈现的内容时被调用;
- onWindowFocusChanged: 当前View的window获得或失去焦点时被调用;
- onDetachedFromWindow:当前View从一个window上分离时被调用。
2.View被加载时,根据参数会有三种情况。
(1). View在Visible(可见)时的调用
onAttachedToWindow ——> onMeasure ——> onSizeChanged ——> onLayout ——> onDraw
(2). View在Visible(不可见)时的调用
onAttachedToWindow ——> onMeasure ——> onSizeChanged ——> onLayout
(3). View在Gone(加载)时的调用
onAttachedToWindow
上面说了View的创建时间的生命周期过程,下面来看下View销毁时的生命周期的过程:
- View销毁时调用 :
onWindowFoncusChanged ——> onWindowVisiblityChanged ——> onDetachedFromWindow
Activity和View的生命周期的关联情况如下图所示:
view和activity的生命周期的关联.png
(1). Activity在onCreate阶段会使用setContentView将xml布局文件的控件映射到Activity布局中。此时View会执行构造方法,完成初始化后回调onFinishInflate方法
(2).在调用生命周期onResume之后,View会相应调用onMeasure方法来测量自身大小,如果大小发生变化就继续调用onSizeChanged,接着通过onLayout计算放置在布局中的位置,之后调用onDraw来绘制界面,Activity会调用onWindowFocusChanged来改变焦点。
(3). onPause和onStop会触发onWindowFocusChanged,告知外界Activity已经失去焦点。
(4). 在Activity销毁调用onDestory时,View会从Activity解绑并调用onDetachedFromWindow.
(5). 异常回收Activity的情况下,保存状态时调用onSaveInstanceState,恢复时调用onRestoreInstaceState。View自身也存在这两个对应的函数,用来保存视图的状态。
(6).View也拥有onCconfigurationChang函数,用于触发视图配置变更,比如横竖屏切换操作。