View 生命周期

作者: Li小强 | 来源:发表于2017-08-06 15:02 被阅读114次

最近由于涉及到视频的自动播放/暂停情况,如果将方法在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();

简单对比:

  1. VisibilityInvisibility 差别:Invisibility 不执行 onDraw()
  2. VisibilityGone 差别: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(); 

简单对比:
VisibilityInvisibility、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并且进行测量的方法,但是不绘制在页面


四、总结

  1. VisibilityInvisibility 对比:后者不进行在页面上的绘制,也就是** Invisibility 不调用 onDraw()**;
  2. InvisibilityGone 对比:后者不进行测量,也就是Gone 不调用
  3. ** onSizeChanged() ** 要注意这个方法,会根据不同情景来调用,但是如果调用一次后,正常情况不会再调用(?);
  4. 可以通过 onAttachededToWindow()、onDetachedFromWindow()、onVisibilityChanged()等方法 进行对 View 在相关生命周期情景里面的处理。

相关文章

网友评论

    本文标题:View 生命周期

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