原文鏈接http://sparkyuan.me轉載請註明出處
Activity在異常情況下的生命週期
關於Activity正常情況下的生命週期請參考這篇文章http://blog.csdn.net/l664675249/article/details/48895903,本文主要講解Activity在異常情況下的生命週期。
情況1:資源相關的系統配置發生改變
資源相關的系統配置發生改變,舉個栗子。當前Activity處於豎屏狀態的時候突然轉成橫屏,系統配置發生了改變,Activity就會銷燬並且重建,其onPause, onStop, onDestory均會被調用。因爲實在異常情況下終止的,所以系統會調用onSaveInstanceState來保存當前Activity狀態。這個方法是在onStop之前,與onPause沒有固定的時序關係。當Activity重建的時候系統會把onSaveInstanceState所保存的Bundle作爲對象傳遞給onRestoreInstanceState和onCreate方法。
注:
- View的源碼中每個View都有onSaveInstanceState和onRestoreInstanceState這兩個方法。
- 接收位置可以是onRestoreInstanceState和onCreate方法,區別是:onRestoreInstanceState如果被調用,參數Bundle一定是有值的,在onCreate中需要判斷參數是否爲null。
- onSaveInstanceState只有在Activity即將銷燬並有機會重新顯示時纔會調用,正常銷燬的Activity生命週期中不會調用,比如:旋轉屏幕,按Home鍵,啓動新Activity等。
情況2:資源內存不足導致低優先級Activity被殺死
Activity優先級
- 前臺Activity——正在和用戶交互的Activity,優先級最高
- 可見但非前臺Activity——Activity中彈出的對話框導致Activity可見但無法交互
- 後臺Activity——已經被暫停的Activity,優先級最低
系統內存不足是,會按照以上順序殺死Activity,並通過onSaveInstanceState和onRestoreInstanceState這兩個方法來存儲和恢復數據。
不讓Activity重新創建的方法
系統配置有很多內容,當某項改變時,我們不想讓Activity重新創建可以在AndroidMainfest中給Activity指定configChanges屬性。比如
android:configChanges="orientation"
configChanges屬性非常多,具體可參考官方文檔
常用的有locale, orientation和keyboardHidden這三個。