简介
View依附于Activity,学习View与Activity生命周期之间的关系,可以更好的理解View的工作原理
写此文时看的文章
Android Activity详解
Android View生命周期
View的生命周期和Activity生命周期的执行顺序
View的生命周期方法和Activity生命周期方法关系
View官方给出的方法
1、Creation(创建)
- Constructors(构造函数):有一种形式的构造函数会在View在代码中被创建时调用,另一种形式的构造函数会在View从layout加载出来时被调用。
2、Layout(布局)
- onMeasure(int, int):该方法在计算当前View及其所有子View尺寸大小需求时会被调用。
- onLayout(boolean, int, int, int, int):该方法在当前View需要为其子View分配尺寸和位置时会被调用。
- onSizeChanged(int, int, int, int):该方法在当前View尺寸变化时被调用。
3、Drawing(绘制)
- onDraw(android.graphics.Canvas):该方法在当前View需要呈现其内容时被调用。
4、Event processing(事件处理)
- onKeyDown(int, KeyEvent):该方法在一个物理按键事件发生时被调用。
- onKeyUp(int, KeyEvent):该方法在一个物理按键弹起事件发生时被调用。
- onTrackballEvent(MotionEvent):该方法在一个轨迹球运动事件发生时被调用。
- onTouchEvent(MotionEvent):该方法在一个触摸屏幕运动事件发生时被调用。
5、Focus(聚焦)
onFocusChanged(boolean, int, android.graphics.Rect):该方法在当前View获得或失去焦点时被调用。
onWindowFocusChanged(boolean):该方法在包含当前View的window获得或失去焦点时被调用。
6、Attaching(附上)
onAttachedToWindow():该方法在当前View被附到一个window上时被调用。
onDetachedFromWindow():该方法在当前View从一个window上分离时被调用。
onVisibilityChanged(View, int):该方法在当前View或其祖先的可见性改变时被调用。
onWindowVisibilityChanged(int):该方法在包含当前View的window可见性改变时被调用。
View的所有生命周期
onFinishInflate() 当View中所有的子控件均被映射成xml后触发
onMeasure(int, int) 确定所有子元素的大小
onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发
onSizeChanged(int, int, int, int) 当view的大小发生变化时触发
onDraw(Canvas) view渲染内容的细节
onKeyDown(int, KeyEvent) 有按键按下后触发
onKeyUp(int, KeyEvent) 有按键按下后弹起时触发
onTrackballEvent(MotionEvent) 轨迹球事件
onTouchEvent(MotionEvent) 触屏事件
onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发
onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发
onAttachedToWindow() 当view被附着到一个窗口时触发
onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的
onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发
View的关键生命周期
--> 构造View()
--> onFinishInflate()
--> onAttachedToWindow()
--> onMeasure()
--> onSizeChanged()
--> onLayout()
--> onDraw()
--> onWindowFocusChanged()
--> onDetackedFromWindow()
View与Activity生命周期
如图
(1) 在Activity onCreate方法中初始化了View , 调用了View 的onFinishInflate
(2) 在执行完 Activity的 onPostResume方法之后(第一次onResume之后)才真正开始了View的绘制工作: onAttachedToWindow –> onMeasure –> onSizeChanged –> onLayout –> onDraw
当按住锁屏键的时候,Activity和View生命周期发生变化:
Activity onPause之后 调用了 View的 onSaveInstanceState方法
当重新回到页面的时候,Activity和View的生命周变化:
View的生命周期方法没有被调用
当点击回退的时候,Activity和View的生命周期发生变化:
Activity onPause -> onStop -> onDestroy
onDestroy之后 调用了 View的onDetachedFromWindow方法
总结
(1) 在Activity onCreate方法中初始化了View 的时候, 调用了View 的onFinishInflate
(2) 在执行完 Activity的 onResume 方法之后,才真正开始了View的绘制工作:onMeasure –>
onSizeChanged –> onLayout –> onDraw
(3) onMeasure,onSizeChanged,onLayout,onDraw可能由于setVisible或onResume调用多次,而onAttachedToWindow与onDetachedFromWindow在创建与销毁view的过程中只会调用一次