場景一: 退出後臺運行
點擊home鍵 onPause() onStop() 退出後
①如果此時A位於棧頂 則調用A的onDestory();
②如果此時B位於棧頂 則先調用A的onDestory()再調用B的onDestory()
但是當你再次進入App時,再次退出後臺運行時 就不會再執行A或者B的onDestory()方法了,查詢了很久,也沒找到具體原因,但是看到一篇帖子 寫到:
- Activity 的 onDestroy() 是系統回調函數, 調用時機是不確定的
- 據張明雲(編程,Andoid開發 話題的優秀回答者)所說,在finish()方法之後沒有立即執行onDestroy()方法,只是上述這個命題的一種情況,不僅如此,Activity的其他生民週期方法何時會調用也是不確定的,onDestroy沒有及時執行暫未找到有效的處理方法,但可以通過isFinishing()方法判斷 Activity 是否處於銷燬狀態。
場景二:A跳轉B B返回A
啓動A
先執行A的 onCreate() -->onStart()-->onResume()
A跳轉B
先執行A的 onPause()
再執行B的 onCreate() -->onStart()-->onResume()
後執行A的 onStop()
B返回A (這裏已經測試過 無論是點擊 手機上的物理鍵 還是調用 finish() 方法進行的返回 生命週期都是如下)
先執行B的 onPause()
再執行A的 onRestart() -->onStart()-->onResume()
後執行B的 onStop()-->onDestory()
場景三:橫豎屏切換 有三種情況(後面對所有的打印結果進行展示)
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次,但是再切換成豎屏時 會多執行onConfigurationChanged()方法
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
onConfigurationChanged方法的作用
通過查閱Android API可以得知android:onConfigurationChanged實際對應的是Activity裏的onConfigurationChanged()方法。
在AndroidManifest.xml中添加上訴代碼的含義是表示在改變屏幕方向、彈出軟件盤和隱藏軟鍵盤時,不再去執行onCreate()方法,而是直接執行onConfigurationChanged()。如果不申明此段代碼,按照Activity的生命週期,都會去執行一次onCreate()方法,而onCreate()方法通常會在顯示之前做一些初始化工作。所以如果改變屏幕方向這樣的操作都去執行onCreate()方法,就有可能造成重複的初始化,降低程序效率是必然的了,而且更有可能因爲重複的初始化而導致數據的丟失。這是需要千萬避免的。
第一種情況
切換橫屏
onSaveInstanceState()--> 保存數據
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()--> 恢復數據
onResume()-->
切換豎屏 執行兩次
onSaveInstanceState()-->
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()-->
onResume()-->
----------------------------------------------------
onSaveInstanceState()-->
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()-->
onResume()-->
第二種情況
切換橫屏
onSaveInstanceState()--> 保存數據
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()--> 恢復數據
onResume()-->
切換豎屏 執行兩次
onSaveInstanceState()-->
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()-->
onResume()-->
----------------------------------------------------
onSaveInstanceState()-->
onPause()-->
onStop()-->
onDestroy()-->
onCreate()-->
onStart()-->
onRestoreInstanceState()-->
onResume()-->
onConfigurationChanged()-->
第三種情況
橫屏
onConfigurationChanged()-->
豎屏
onConfigurationChanged()-->
以後遇到更多的場景再進行添加