介紹Activity生命週期的文章網上有很多了。
本文重點介紹下onDestroy執行的一些場景。
先看下生命週期流程圖
容易被開發者忽略的就是,onDestroy方法,在App被強制殺死時,是不會執行的。最近整合第三方sdk時遇到一個現象,通過判斷onDestroy方法執行,來避免了重大bug。
例子: ActivityA 是我專案的主介面 ActivityB 是第三方sdk專案主介面
ActivityA啟動ActivityB, ActivityB介面點選返回鍵,返回到ActivityA。
觀察介面,發現每次ActivityA都會重新開啟初始化,特別慢。通過列印ActivityA的生命週期,發現沒有執行onDestroy方法,但執行了onCreate方法,所以判斷應該是第三方sdk在主介面返回時殺死了App,檢視程式碼,果然如此。
下面是生命週期的一些例子。
啟動FirstActivity
E/FirstActivity: onCreate bundle null
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
複製程式碼
正常情況
- 開啟SecondActivity(執行FirstActivity的onStop)
E/FirstActivity: onPause
E/SecondActivity: onCreate bundle null
E/SecondActivity: onStart
E/SecondActivity: onResume
E/SecondActivity: onPostResume
E/FirstActivity: onSaveInstanceState
E/FirstActivity: onStop
複製程式碼
- 在SecondActivity介面,點選返回鍵。
E/SecondActivity: onPause
E/FirstActivity: onRestart
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
E/SecondActivity: onStop
E/SecondActivity: onDestroy
複製程式碼
- 在SecondActivity中按鈕點選,使用System.exit(0)強制殺死App。
系統會預設開啟FirstActivity。 FirstActivity的onDestroy方法沒有執行,而是直接執行onCreate方法。
SecondActivity的任何方法都沒有執行。
E/FirstActivity: onCreate bundle Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=800], android:lastAutofillId=1073741823}]
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
複製程式碼
在開發者模式中,設定不保留活動
- 開啟SecondActivity。(會執行FirstActivity的onDestroy方法。)
E/FirstActivity: onPause
E/SecondActivity: onCreate bundle null
E/SecondActivity: onStart
E/SecondActivity: onResume
E/SecondActivity: onPostResume
E/FirstActivity: onSaveInstanceState
E/FirstActivity: onStop
E/FirstActivity: onDestroy
複製程式碼
- 在SecondActivity介面,點選返回鍵。
會開啟FirstActivity,執行onCreate方法,並傳入Bundle。
SecondActivity的生命週期會繼續執行。
E/SecondActivity: onPause
E/FirstActivity: onCreate bundle Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=800], android:lastAutofillId=1073741823}]
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
E/SecondActivity: onStop
E/SecondActivity: onDestroy
複製程式碼
onDestroy方法執行邏輯
-
正常關閉,或被系統強制殺死Activity(不保留活動方式測試)的情況,執行onDestroy。
-
程式碼強制關閉App,或被系統強制殺死App的情況,不執行onDestroy。