Activity生命週期onDestroy

介紹Activity生命週期的文章網上有不少了。android

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

先看下生命週期流程圖測試

容易被開發者忽略的就是,onDestroy方法,在App被強制殺死時,是不會執行的。

最近集成第三方sdk時遇到一個現象,經過判斷onDestroy方法執行,來避免了重大bug。spa

例子: ActivityA 是我項目的主界面 ActivityB 是第三方sdk項目主界面3d

ActivityA啓動ActivityB, ActivityB界面點擊返回鍵,返回到ActivityA。code

觀察界面,發現每次ActivityA都會從新打開初始化,特別慢。經過打印ActivityA的生命週期,發現沒有執行onDestroy方法,但執行了onCreate方法,因此判斷應該是第三方sdk在主界面返回時殺死了App,查看代碼,果真如此。cdn

下面是生命週期的一些例子。blog

啓動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。

相關文章
相關標籤/搜索