Activity的生命週期(2)

異常情況下Activity的生命週期的分析

上次我們說到Activity的生命週期,那些都是一般情況下,會出現的,但是總有一些特殊的情況出現,那麼此時Activity的生命週期又是怎麼樣的呢?

情況一:

資源相關的系統配置發生改變的時候導致Activity被殺死並且重新創建

首先理解這個問題,我們應該對系統的資源加載有一定的理解,現在,我們可以舉一個例子,簡單的理解一下:爲了做適配的時候我們在drawable文件下放了尺寸不同的圖片,當手機從豎屏變爲橫屏的時候,手機會拿到兩張不同的圖片,在默認的情況下,屏幕旋轉的時候,Activity就會被銷燬並且重建,在默認的情況下,我們不做任何處理的時候Activity的生命週期如下:
屏幕旋轉的時候Activity發生的變化

當系統配置發生變化之後,Activity會被銷燬其onPause,onStop,onDestroy都會被調用,同時由於Activity是在異常狀態下終止的,因此係統會自動的調用onSaveInstanceState來保存當前Activity的狀態.這個方法的調用時機在onStop之前,它和onPause沒有既定的時序關係,它可能在onPause之前調用也可能在onPause之後調用.

當Activity重建的時候,會調用onRestoreInstanceState,並且把Activity銷燬時onSaveInstanceState方法保存的Bundle對象作爲參數同時傳遞給onRestoreInstanceState和onCreate方法,因此我們可以通過onRestoreInstanceState和onCreate方法是否被調用了來判斷Activity是否被重建了,如果被重建了,我們就可以取出之前保存的數據,並且恢復.從時序上來說,onRestoreInstanceState的調用在onCreate方法執行之後.

系統有自動恢復當前Activity視圖的機制,它會保存一些數據,比如說文本輸入框的數據等等,在Activity重建的時候,就會自動幫我們恢復它保存的數據.

上面我們已經分析了,系統數據的存儲與恢復的機制,那麼我們有沒有辦法,在系統配置發生改變的時候不讓Activity重新創建呢?答案當然是可以的!

如果我們不想在屏幕發生旋轉的時候,重新創建Activity,那麼我們只需要在Activity的中指定configChange的屬性即可:在清單文件中可以添加這樣如下的代碼:
andriod:configChanges="orientation"

當然我們想指定多個值的時候,可以用’|’鏈接起來,比如:
andriod:configChanges="orientation|keyboardHidden"

注意:系統只有在Activity異常終止的時候纔會調用onSaveInstanceStateonRestoreInstanceState來保存和恢復數據,其他的情況不會觸發這個過程.

情況二:

資源內存不足,導致優先級低的Activity被殺死
在這裏我們要先介紹一個
Activity的優先級的的排列:
大致可以分爲以下三種
1. 前臺Activity:正在和優化交互的Activity,優先級最高.
2. 可見但非前臺的Activity:可以看到,但是無法與用戶交互的Activity(比如Activity中彈出了一個對話框,導致Activity可見但是無法與用戶進行交互)
3. 後臺的Activity :這個比較好理解,就是已經被暫停的Activity(不可見的Activity)

當系統的內存不足的時候,系統就會按照上述的優先級去殺死目標Activity所在的進程,並後續的通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據.

注意:如果一個進程沒有四大組件運行的時候,那麼這個進程將很快被殺死,因此,一些後臺的工作不適合脫離四大組件而獨立運行的原因也在於此.

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章