介紹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
E/FirstActivity: onCreate bundle null
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
複製代碼
E/FirstActivity: onPause
E/SecondActivity: onCreate bundle null
E/SecondActivity: onStart
E/SecondActivity: onResume
E/SecondActivity: onPostResume
E/FirstActivity: onSaveInstanceState
E/FirstActivity: onStop
複製代碼
E/SecondActivity: onPause
E/FirstActivity: onRestart
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
E/SecondActivity: onStop
E/SecondActivity: onDestroy
複製代碼
系統會默認打開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
複製代碼
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
複製代碼
會打開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
複製代碼
正常關閉,或被系統強制殺死Activity(不保留活動方式測試)的狀況,執行onDestroy。
代碼強制關閉App,或被系統強制殺死App的狀況,不執行onDestroy。