最近由于涉及到视频的自动播放/暂停情况,如果将方法在Activity里面写,耦合情况很严重,考虑到View的生命周期,发现对View的生命周期有点模糊。
看了几篇关于View的生命周期的文章,感觉自己再试一次,写一篇。
文中有参考自,http://www.jianshu.com/p/08e6dab7886e。
以下纯属个人见解。
如果有错误,希望各位大触能指出来,谢谢大佬们ヾ(●゜ⅴ゜)ノ。
一、界面
界面有3个按钮,和一个继承View的MyView,里面重写了各种方法方便Log。
此处测试的界面比较简单,如果涉及到View的嵌套,onVisibilityChanged 方法里面的 changeView 也会涉及到嵌套的View。
二、四种常用情景的生命周期变化
(一)启动 Activity,新建 View
1. 默认 visibility 启动
2. 默认 invisibility 启动
3. 默认 gone 启动
通过对比总结
// visibility、invisibility、gone 都执行
构造方法;
onFinishInflate();
onAttachedToWindow();
onWindowVisibilityChanged(); // 窗口可见度 == visibility
onVisibilityChanged(); // changeView == MyView,visibility == 对应的情况
// gone 不执行,visibility、invisibility 执行
onMeasure();
onSizeChanged();
onLayout();
onDraw(); // invisibility 、gone 不执行,visibility 执行
onWindowFocusChanged(); // true
// gone 到此结束。
// visibility、invisibility 继续执行
onMeasure();
onLayout();
// invisibility 不执行,visibility 执行
onDraw();
简单对比:
- Visibility 与 Invisibility 差别:Invisibility 不执行 onDraw();
- Visibility 与 Gone 差别:Gone 不执行 onMeasure()、onSizeChanged()、onLayout()、onDraw(),也就是一系列涉及测量与绘制的方法
(二)点击Home键返回桌面
visibility 、invisibility、gone 三种情况返回桌面都一样
总结
// visibility、invisibility、gone 都执行
onWindowFocusChanged(); // false
onWindowVisibilityChanged(); // 窗口可见度 == gone
onVisibilityChanged(); // changedView == DecorView,可见度 == Invisibility
(三)从桌面返回应用
1. visibility 时候
2. invisibility 、gone 时候(这两种情况一样)
通过对比总结
// visibility、invisibility、gone 都执行
onWindowVisibilityChanged(); // 窗口可见度 == invisibility
onVisibilityChanged(); // changeView == DecorView,可见度 == visibility
onWindowVisibilityChanged(); // 窗口可见度 == visibility
// invisibility 、gone 不执行,visibility 执行
onDraw();
简单对比:
Visibility 与 Invisibility、Gone 差别:Visibility 会执行 onDraw() 的绘制操作。
(四)销毁Activity、View
visibility 、invisibility、gone 三种情况都一样
总结
// visibility、invisibility、gone 都执行
onWindowFoucsChanged(); // false
onWindowVisibilityChanged(); // 可见度 == gone
onDetachedFromWindow(); // View 执行后,已销毁
三、View 的 Visibility 之间切换时候的生命周期变化
(一)Visibility 与 Invisibility 之间的切换
1. Visibility --> Invisibility
修改 MyView 的可见度为 invisibility。
2. Invisibility --> Visibility
修改 MyView 的可见度为 visibility,并且在页面绘制( 调用 onDraw() )。
(二)Visibility 与 Gone 之间的切换
1. Visibility --> Gone
修改 MyView 的可见度为 gone。
2. Gone --> Visibility
有两种情况
(1)由 Visibility 切换到 Gone,再切换回去
(2)View 默认 Gone , 第一次切换到 Visibility
第一种情况 对比 第二种情况,不调用 onSizeChanged() 方法。
修改 MyView 的可见度为 visibility,并且进行一系列测量、绘制的方法。
(三)Invisibility 与 Gone 之间的切换
1. Invisibility --> Gone
修改 MyView 的可见度为 gone。
2. Gone --> Invisibility
有两种情况
(1)由 Invisibility 切换到 Gone,再切换回去
(2)View 默认 Gone , 第一次切换到 Invisibility
第一种情况 对比 第二种情况,不调用 onSizeChanged() 方法。
修改 MyView 的可见度为 Invisibility,并且进行测量的方法,但是不绘制在页面。
四、总结
- Visibility 与 Invisibility 对比:后者不进行在页面上的绘制,也就是** Invisibility 不调用 onDraw()**;
- Invisibility 与 Gone 对比:后者不进行测量,也就是Gone 不调用;
- ** onSizeChanged() ** 要注意这个方法,会根据不同情景来调用,但是如果调用一次后,正常情况不会再调用(?);
- 可以通过 onAttachededToWindow()、onDetachedFromWindow()、onVisibilityChanged()等方法 进行对 View 在相关生命周期情景里面的处理。
网友评论