pythoncat1024/blog

android activity 退出闪屏

Opened this issue · 0 comments

Android Activity opStop 延时执行导致的闪屏

界面上有两个 activity, 这里命令为 A,B. 然后是 A启动B,B退出后回到A.

出现的现象会诡异,只在华为的部分机型上面会出现闪屏,而且还是非必现。

找了半天,怀疑这个怀疑那个。

  1. 怀疑跟activity切换动画有关,就直接把切换动画禁用了。(本来动画就是在主题里面设置的,然后就去掉了这个设置) =================== 无效
  2. 怀疑是界面的ListView刷新过于频繁导致的,直接来一个粗暴的处理,如果 oldlength == newLength 就不刷新。 ==================== 无效
  3. 实在找不到原因了。怀疑跟 activity启动模式有关,把A启动模式换成singleTop. 也是没有效果
  4. 找不到了,放弃了。

...

这时候我想到了黄猫。于是就把问题描述了一下,问了黄猫。

  • 黄猫先问我,是A闪屏,还是B闪屏?

我看现象其实看不太出来到底是A还是B ,但是多看几次,感觉应该是A. 就告诉黄猫是A.

  • 然后黄猫就叫我看看A的显示逻辑。

我一想,这显示逻辑应该没有什么问题的,不然别的手机怎么能正常显示呢,而且闪屏的手机也能正常显示啊。

没辙了,我想到了一个通用定位之道,就是打log我在AB的所有生命周期的回调方法里面全部打了log.

然后结合log和闪屏现象,我发现了一个规律:就是A启动B的时候,如果AonStop被执行了,那么B退出,返回到A的时候,就不会闪屏;如果AonStop没有被执行,那么B退出,返回到A的时候,就会闪屏;

那么,现在的问题就变成了为什么A启动B,有时候A会执行onStop,有时候不会呢?

联系正常的Activity切换的生命周期:FirstActivity启动SecondActivity,然后SecondActivity退出返回FirstActivity.

           这里的正常,指的的标准启动模式。
  1. F启动S ==> 首先是F执行onPause,接着S执行了onCreate,onStart,onResume, 接着 F执行onStop.
  2. S退出,===> 首先是S执行onPause,接着F执行了onRestart,onStart,onResume , 接着S执行onStop,onDestroy.

对于 **FirstActivity启动SecondActivity,启动之后,主动调用FirstActivity.finish()退出FirstActivity**这种,生命周期的执行过程是:首先是F执行onPause,接着S执行了onCreate,onStart,onResume, 接着 F执行onStop,onDestroy.

那么,可以推测是BonRestart,onStart,onResume 中做了某种耗时操作,导致AonStop不能被立即执行到。

然后我就去看了BonRestart,onStart,onResume,发现里面确实做了很多的逻辑。没办法,我最终的解决方案就是在A启动B的时候,同时finish A.