注意Tween Animation对Activity生命周期的影响

最近遇到一个神奇的问题——一个Activity调用finish()后,该页面的onStop()onDestroy()间隔大概十秒后才被调用。

分别谷歌、百度了一下这种现象,资料很少,而且说法各不相同,都不适用于我的这种情况。后来排查了一天,终于定位到了原因:Tween Animation

起因是,我在A页面里有一个自定义控件,这个控件通过Tween Animation实现上下翻转信息流的动画效果。如果当这个控件只有一个信息,不进行动画时,启动B页面,然后B页面调用finish(),则onStop()onDestroy()如期执行;如果A页面的控件多于一个信息,进行动画时,启动B页面再finish(),则onStop()onDestroy()会延迟10s左右被调用。

至于为什么Tween Animation会影响到生命周期,具体原因未知,我尝试翻看了一下View的源代码,并没有什么发现,与此比较类似的问题可以看下这篇文章:Android 坑档案:背黑锅的 Fragment

不过,从这个问题也能引申出一些结论:

  1. 尽量使用Property Animation而非Tween Animation,Tween Animation本质是Viewdraw的过程中执行的,Tween Animation依赖于View的绘制、并且可能影响View的生命周期进而影响Activity;而Property Animation则不依赖View的绘制,不会对生命周期产生影响。
  2. 不要依靠ActivityonStop()onDestroy()方法来执行回收、停止等类似的操作。说到底,onStop()onDestroy()都是依靠底层的消息机制来通知回调的,它并不能确保每次都准时回调。所以最好的方法,是在onPause()中通过判断isFinishing()当前页面是否正在关闭。
The ABC of Dart Part 4 - 集合 AudioTrack播放卡顿的现象

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×