今天我在項目中遇到一個很是奇怪的問題, 我先描述一下問題 咱們在棧內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
A1跳轉到A2,A2樣式爲Dialog(@android:style/Theme.Dialog):A1生命週期執行onPause(),返回時onResume()。it
A1跳轉到A2,A2樣式不是Dialog(@android:style/Theme.Dialog): A1生命週期執行onPause()-->onStop(),返回時onStart()-onResume()。(通常狀況)總結
A1跳轉到A2再跳轉到A1 A1的啓動模式爲singleTask,A2樣式爲Dialog(@android:style/Theme.Dialog):A1生命週期執行onPause() 再次跳轉到A1的生命週期是onNewIntent()-->onResume()。項目
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
A1跳轉到A2,A2樣式屬性windowIsTranslucent設置爲true(Activity界面透明):A1生命週期執行onPause(),返回時onResume()。vi
A1跳轉到A2,A2樣式屬性windowIsTranslucent設置爲fasle(大部分Activity界面):A1生命週期執行onPause()-->onStop(),返回時onStart()-->onResume()。(通常狀況)
注意: 在上面的狀況中,A2的生命週期都是是正常的 onCreat()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()