windowIsTranslucent引发的血案

       最近项目中如果app处于后台时间过长,重新打开app后会出现一种很奇怪的现象。具体表现就是:首页(MainActivity)处于活动状态,但是二级页面(SecondActivity)处于ui可见页面,如果点击某个区域响应的反而是首页的事件,类似一种页面假死状态,给用户体验很不友好,主要在小米手机触发频率较高。可能效果不太好描述,百度、google未果,只有自己硬着头皮研究。

       都知道如果app处于后台,有被系统强杀的风险,为了方便验证,便于复现问题,手动开启了开发者模式下的“不保留活动”。事实上也是如此,且会触发onRestoreInstanceState()。一开始以为是同事在BaseActivity中保留了Activity或者通过静态变量记录app是否被强杀跳转MainActivity造成的,经过测试并不影响。最后就考虑打印触发的activity生命周期。

  • 依次进入MainActivity、SecondActivity

windowIsTranslucent引发的血案_第1张图片windowIsTranslucent引发的血案_第2张图片

已经发现问题了,正常情况下MainActivity#onStop()并没有触发

  • 点击home进入到后台

windowIsTranslucent引发的血案_第3张图片

这个时候才调用MainActivity#onStop()等系列方法,可以看到MainActivity已经销毁了,但SecondActivity仍然存在

  • 点击桌面icon进入前台

windowIsTranslucent引发的血案_第4张图片

这里就发生了一个明显的问题,MainActivity、SecondActivity居然都调用了onResume(),正常情况下,两个Activity应该只会后者调用,而会触发前者调用,之前一直以为只要dialog类型的Activity,以前做全局弹窗的时候用过,那这个SecondActivity就很像,然后就去查看theme属性,果然一个属性让我豁然开朗,true,以前开发很少用到这个属性,但是因为是其他同事配置在通用theme,所有也跟着复用了。之前的一切不合理就好理解了。

  • 最后点击返回键看下结果

windowIsTranslucent引发的血案_第5张图片

重新设置这个属性android:windowIsTranslucent为false,运行查看生命周期如下:

windowIsTranslucent引发的血案_第6张图片

windowIsTranslucent引发的血案_第7张图片windowIsTranslucent引发的血案_第8张图片

windowIsTranslucent引发的血案_第9张图片

windowIsTranslucent引发的血案_第10张图片

修改之后,activity被强杀后,页面也能正常恢复,至此问题也解决了。

对比看下生命周期的变化:(透明与不透明窗口唯一区别就是windowIsTranslucent的值(前者为true,后者为false))

  • 第一次进入MainActivity
    透明窗口:   MainActivity#onCreate()->MainActivity#onStart()->MainActivity#onResume()
    不透明窗口: MainActivity#onCreate()->MainActivity#onStart()->MainActivity#onResume()
    
  • 第一次进入SecondActivity
    透明窗口:   MainActivity#onPause()->SecondActivity#onCreate()->SecondActivity#onStart()->SecondActivity#onResume()
    不透明窗口: MainActivity#onPause()->SecondActivity#onCreate()->SecondActivity#onStart()->SecondActivity#onResume()->MainActivity#onStop()->MainActivity#onSaveInstanceState()->MainActivity#onDestroy()
    
  • 点击home进入后台
    透明窗口:   SecondActivity#onPause()->MainActivity#onStop()->MainActivity#onSaveInstanceState()->SecondActivity#onStop()->SecondActivity#onSaveInstanceState()->MainActivity#onDestroy()
    不透明窗口: SecondActivity#onPause()->SecondActivity#onStop()->SecondActivity#onSaveInstanceState()->SecondActivity#onDestroy()
    
  • 点击桌面icon进入前台
    透明窗口:   MainActivity#onStart()->MainActivity#onRestoreInstanceState()->MainActivity#onResume()->SecondActivity#onRestart()->SecondActivity#onStart()->SecondActivity#onResume()
    不透明窗口: SecondActivity#onCreate()->SecondActivity#onStart()->SecondActivity#onRestoreInstanceState()->SecondActivity#onResume()
    
  • 点击返回键
    透明窗口:   MainActivity#onPause()-> MainActivity#onStop()->MainActivity#onDestroy()
    不透明窗口: SecondActivity#onPause()->MainActivity#onCreate()->MainActivity#onStart()->MainActivity#onRestoreInstanceState()->MainActivity#onResume()->SecondActivity#onStop()->SecondActivity#onDestroy()

测试项目地址

你可能感兴趣的:(Android)