Activity的生命週期

1.1Activity的生命週期

1.1.1典型情況下的生命週期分析

  1. onCreate:表示Activity正在被創建,這是生命週期的第一個方法。此方法主要做一些初始化的工作,但是不要做耗時操作(會引發ANR)
  2. onStart:表示Activity正在被啓動,即將開始,此時Activity 已經可見,但是沒有在前臺,無法與用戶交互,可以理解爲雖然已經顯示出來了,但是我們還看不到。
  3. onResume:表示Activity已經可見了並且可以進行交互。此時的Activity已經在前臺了。
  4. onPause:表示Activity正在停止,正常情況下,緊接着onStop會被調用。(不可交互)。此時可做一些存儲數據、停止動畫等工作,不能太過耗時,否則會影響到新Activity的顯示。onPause先自行完成後,新Activity的onResume纔會執行。
  5. onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,但是不能太過耗時。
  6. onRestart:比哦啊還是Activity正在重新啓動。一般情況下,噹噹前Activity從不可見重新變成可見狀態時,onRestart就會被調用。
  7. onDestroy:比哦啊還是Activity即將被銷燬,可以做一些回收工作和最終的資源釋放。
  8. 圖示:
    在這裏插入圖片描述

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

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

假設我們爲了兼容橫豎屏,我們讓其加載兩張不同的圖片(設定了landscape或者portrait狀態下的圖片)。
如果當前是豎屏狀態,濡染旋轉屏幕,那麼由於系統配置發生改變,在默認情況下,Activity就會銷燬並且重新創建(當然,我們能夠阻止系統重新創建我們的Activity)。
默認情況下,系統配置發生改變後,Activity就會被銷燬,並且重新創建,其生命週期如下:
在這裏插入圖片描述
其中onSaveInstanceState方法會在onStop方法之前調用。當Activity被重新創建後,系統會調用onRestoreInstanceState,並且把Activity銷燬時onSaveInstanceState方法保存的Bundle對象傳遞給onRestoreInstanceState和onCreate。因此我們能夠通過這兩個方法判斷Activity是否被重建了,如果重建,就取出之前的數據並且進行恢復。onRestoreInstanceState的調用時機是在onStart之後。
關於保存和恢復View層次結果,系統的工作流程是這樣的:首先Activity被意外終止時,Activity會調用onSaveInstanceState去保存數據,然後會委託Window去保存數據,Window會委託它上面的頂級容器去保存數據。(頂層容器是一個ViewGroup,一般爲DecorView。)頂層容器再去一一通知它的子元素來保存數據,過程結束。

2.資源內存不足導致優先級低的Activity被殺死

數據存儲過程跟情況1完全一致。
關於優先級:

  1. 前臺Activity–正在跟用戶交互的Activity,優先級最高
  2. 可見但非前臺Activity–比如Activity中彈出一個對話框,導致Activity可見但是位於後臺無法和用戶直接交互
  3. 後臺Activity–已經被暫停了的Activity,比如執行了onStop,優先級最低
    當系統系統內存不足時,系統會按照上述優先級去殺死Activity所在的進程,並在後續通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。(所以,後臺工作最好是不要脫離四大組件,不然的話很容易就給殺死了,可以使用service)

如果不想系統配置發生改變後,Activity就進行重新創建呢?

可以指定Activity的configChanges屬性
如:不想Activity在屏幕旋轉的時候重新創建,就可以給configChanges屬性添加orientation這個值:
android:configChanges="orientation"
如果我們想指定多個值,那麼就可以用"|"連接起來,如:android:configChanges="orientation|keyboardHidden"
下圖是這個屬性的一些值以及其意義:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章