当Activity主题为Dialog或者windowIsTranslucent为true,生命周期的onStop不执行的问题

今天我在项目中遇到一个很是奇怪的问题, 我先描述一下问题 咱们在栈内Activity状况以下 A--->B---> C---> D 咱们的B为 singleTask模式启动的,其余的界面默认模式启动, 这个时候咱们若是再次从D界面启动B界面,那么B的生命周期界面应该为
onNewIntent()--->onReStart()--->onStart()--->onResume(),(请注意刚刚说的这个生命周期是正确的), 可是在个人项目中我却发现生命周期并非这样显示的 而是显示了 onNewIntent()--->onResume().为何会出现这种状况呢。根据个人判断我发现这个跟C界面的主题属性有关, 请注意主题中的 <item name="android:windowIsTranslucent">true</item> 当这个值为 true 的时候 咱们B界面的Activity的生命周期的onstop会不执行, 直接致使了咱们在生命周期与咱们正常的不一致。android

当我将 <item name="android:windowIsTranslucent">false</item>改成false 的时候生命周期按上面流程启动生命周期为 onNewIntent()--->onReStart()--->onStart()--->onResume() ,变成我总结的样子。.net

好了我来总结一下:若是咱们从一个Activity A 启动一个Activity B的时候,若是Activity B的主题属性中 <item name="android:windowIsTranslucent">true</item> 为true和话那么 Activity A 中的onStop不会执行。若是A为singleTask启动模式,那么咱们再次启动A 的时候 生命周期为 onNewIntent()--->onResume()。 而不是onNewIntent()--->onReStart()--->onStart()--->onResume() 遇到这种BUG事很是让人头疼的,由于你并不知道这些细节问题。还好我发现了。生命周期

总结:get

style/Theme.Dialog:

  1. A1跳转到A2,A2样式为Dialog(@android:style/Theme.Dialog):A1生命周期执行onPause(),返回时onResume()。it

  2. A1跳转到A2,A2样式不是Dialog(@android:style/Theme.Dialog): A1生命周期执行onPause()-->onStop(),返回时onStart()-onResume()。(通常状况)总结

  3. A1跳转到A2再跳转到A1 A1的启动模式为singleTask,A2样式为Dialog(@android:style/Theme.Dialog):A1生命周期执行onPause() 再次跳转到A1的生命周期是onNewIntent()-->onResume()。项目

  4. A1跳转到A2再跳转到A1 A1的启动模式为singleTask,A2样不为Dialog(@android:style/Theme.Dialog):A1生命周期执行onPause()-->onStop() 再次跳转到A1的生命周期是onNewIntent()-->onReStart()-->onStart()-->onResume()。(通常状况)样式

注意: 在上面的状况中,A2的生命周期都是是正常的 onCreat()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()top

windowIsTranslucent:

  1. A1跳转到A2,A2样式属性windowIsTranslucent设置为true(Activity界面透明):A1生命周期执行onPause(),返回时onResume()。vi

  2. A1跳转到A2,A2样式属性windowIsTranslucent设置为fasle(大部分Activity界面):A1生命周期执行onPause()-->onStop(),返回时onStart()-->onResume()。(通常状况)

注意: 在上面的状况中,A2的生命周期都是是正常的 onCreat()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()

相关文章
相关标签/搜索