Activity生命週期onDestroy

Jimmie發表於2019-04-17

介紹Activity生命週期的文章網上有很多了。

本文重點介紹下onDestroy執行的一些場景。

先看下生命週期流程圖

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。

相關文章