Android安卓中Activity活動生命週期

前言

Activity作爲安卓四大組件之一,平常我們接觸得最多得也是activity,所以很有必要詳細瞭解一下他的詳細生命週期。這篇文章定位是有一點安卓基礎的,所以還完全不瞭解的可以先去學習一下activity。這篇文章主要是講活動的生命週期。
活動的生命週期,人有胎兒期,青春期,老年期一樣,活動同樣有他的各種生命狀態。我們出生會哭,進入成年期會有成人禮。活動也一樣,每進入一個狀態都會回調相應的方法。對於我們來說,活動週期就是活動會在活動具體哪個時候會回調哪一些方法,然後我們可以重寫這一些方法,來實現我們的功能。所以我們得具體瞭解究竟什麼時候調用什麼方法。例如在onCreate方法中初始化,在destroy中釋放內存等等。
那接下來就看看他的具體生命週期。

活動的狀態

首先得了解一下活動的狀態。我個人的理解把活動分爲四個狀態:後臺狀態,暫停狀態,運行狀態和銷燬狀態。

  1. 停止狀態:這個狀態表示活動未進入前臺,我們看不到也無法交匯。切換界面活動都會在後臺。如果內存緊張的話有可能被回收。就像我們有時候打遊戲切換到微信回了一下信息,回來的時候臥槽怎麼把我遊戲退了,就是這樣。
  2. 運行狀態:這個不用多講,當你在交匯的這個活動就是運行狀態。
  3. 暫停狀態:當彈出一個提示框,我們回發現無法與原來的界面交匯了,就是隻能點那個提示框。當一個活動位於棧頂,也就是你看的見他,但是你沒辦法操作他,這個時候就是屬於暫停狀態。
  4. 銷燬狀態:就是被移出棧頂的活動,馬上就會被回收了。例如你退出一個應用他馬上就會被殺了。

常規情況下的生命週期

典型情況下的生命週期

每個活動正常啓動的話都會經歷的生命週期如下圖

活動啓動
onCreate
onStart
onResume
Activity運行
onPause
onStop
onDestroy
活動銷燬
onRestart

每到一個時間點都會調用相關的方法,接下來一個一個來分析一下這些方法。

  1. onCreate:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

這是我們每個活動都會用到的一個方法。他在活動被創建的時候被調用,且只會調用一次。除非被destroy重新創 建。我們一般在這個方法中做一下初始化的事情。例如加載佈局資源等等。細心的讀者可能會注意到他有一個Bundle參數,這個參數主要是用於保存被異常銷燬事的數據的,這個在後面會講到

  1. onStart:顧名思義這個方法表示活動正在啓動,這個時候活動界面已經看的見了,但是還不能與用戶交匯,簡單點說就是你看得到點不了。但是一般速度很快不會讓你感受到這個現象,不然就會好像卡死一樣了。所以不能在這個方法中做重量級的操作,初始化什麼的都放在onCreate。

  2. onResume:這個方法表示活動顯示在前臺了而且也可以用了。onStart和onResume主要配合onPause和onStop方法來使用,下面會講到。

  3. onPause:活動被暫停的時候會調用到。例如一些彈出提示框,看得到界面但是無法進行交匯。一般執行完這個方法後緊接着就會執行onStop方法了。這個方法可以做一些動畫的暫停工作等等輕量級的工作,不然彈個提示框都要卡一下用戶體驗也很差對吧。
    如果沒有進入onStop這個環節的話,回到原Activity的話,那麼就會調用onResume這個方法了

  4. onStop:這個方法在活動即將停止的時候調用,同樣不能做重量級的工作。一般切換界面,如果內存足夠沒有被殺死的話,這個活動就會進入停止狀態。

  5. onRestart:當活動從停止狀態回來的時候就會調用這個方法。狀態和onStart其實是差不多的,只是爲了區分是正常打開的還是從停止狀態回來的,可以分別寫不同的方法。

  6. onDestroy:活動被銷燬的時候會調用這個方法。可以做一些資源的釋放什麼的。但這裏要特別強調的一點就是並不是所有情況下活動被銷燬都會調用這個方法。例如當你按下返回鍵回到上個界面,這個當然是會執行這個方法。但是如果你切換到了別的應用或者回到了桌面,這個應用被後臺殺死了,那麼只有處於棧頂也就是這個應用最後打開的活動會執行destroy方法,其他都不會,需要特別注意一下。
    在這裏插入圖片描述

一些例外情況的生命週期

有一句話叫做用戶永遠不會按照你的設想去使用軟件,活動也一樣,總是會出現一些比較不一樣的情況。這些情況活動是怎麼跑的也來看看:

  1. 返回桌面的時候:返回桌面其實就像切換到別的活動是一樣的道理,這個時候執行的方法是:onPause --> onStop。
  2. 當活動被系統回收再被打開,流程和打開一個新的活動是一樣的。
  3. 打開新的活動時先執行onPause方法再啓動新的活動,onStop會慢一點點執行。

異常情況下的生命週期

這裏的異常情況主要有兩種:一種是放在後臺被殺死了,不是我們主動去終結他的生命的,第二種是設備的配置發生了改變,例如屏幕翻轉。對於這兩種情況我們具體來看一下

情況1 :資源相關的系統配置發生改變

這個資源相關的系統配置怎麼說呢。我們的項目目錄下不是有drawable-hdpi ,drawable-mdpi,這一類的文件夾,在不同的屏幕尺寸下會獲取不同的圖片,就像我們手機和平板也是一樣有兩個不同的配置。平常中我們翻轉屏幕時,屏幕尺寸就發生了變化,準確來說時屏幕的長寬比例發生了變化,那麼這個時候Activity就會被重建(當然你也可以設置他不重建)。
細心的讀者會發現,即使我的屏幕翻轉了,活動重建了,可是還是保留着剛剛我操作的內容啊!例如我在輸入框輸入了Hello World翻轉後還是Hello World,不是說活動被重建了嗎,爲什麼這些還存在?
不知道還記不記得onCreate方法中有一個Bundle參數嗎?沒錯,這個參數就是記錄之前的數據的。重建的過程和平常的殺死啓動活動有一些不一樣,看一下:

屏幕翻轉
重新創建
Activity運行
onPause,onSaveInstanceState
onStop
onDestroy
onCreate
onRestoreInstanceState
onStart,onResume
Activity重新啓動

可以看到最主要的不同就是多了onSaveInstanceState和onRestoreInstanceState這兩個方法。
活動在這種異常的情況下被終結生命後,就會調用onSaveInstanceState方法來保存目前的數據,這個方法在onStop方法前調用,但是和onPause方法的前後關係沒有必然的關係。然後作爲一個Bundle參數傳遞給重新創建的活動。這個Bundle對象會在onCreate方法中和onRestoreInstanceState中被使用。onRestoreInstanceState這個方法主要就是把剛纔的數據還原,執行的次序是在onStart之後。
要注意的一點是,onSaveInstanceState方法只有在活動還會被重建的時候纔會被調用。例如你手動把他後臺殺了,是不會調用這個方法的。

情況2:資源內存不足導致活動被殺死

當系統內存不足的時候,系統就會按照優先級的大小去殺死一些活動,並在後續通過上面onSaveInstanceState和onRestoreInstanceState方法來恢復數據。優先級按照狀態依次是:運行狀態,暫停狀態,停止狀態。一般最有可能是停止狀態的活動被殺了。所以一些後臺工作就儘量放在service中防止被殺死

總結

講了這麼多的生命週期,其實我也是簡單講了我們在使用中一般會遇到的生命週期。有一些讀者可能會有這個疑問:爲什麼我主動調用了onDestroy方法但是活動卻沒有被殺死?舉個例子,你給一個嬰兒舉辦成人禮,他會馬上成人嗎?要注意的一點就是,我們所說的這些生命週期的回調方法,本質上他們都是一樣的,只是被調用的時間不用。他們只是在活動的不同時間被調用,並不是調用這個方法去推進活動的生命進行。主動銷燬活動我們用到的是finish(),而不是onDestroy,要特別注意。

生命週期是活動很重要的一部分,只要瞭解了他的生命週期我們纔可以在準確的時間給他做一些正確的事情。例如你的孩子進入了青春期,你就得跟他說好好學習不要老是想着談戀愛對吧。我之前自己出過一個低級錯誤就是在onCreate方法之前使用findViewById,活動都還沒創建,怎麼找得到佈局呢。充分了解這些生命週期後就不會犯這些低級錯誤了。

我也是一個安卓新手,有哪些地方寫的不好還請大佬們指教

·
·
·

參考資料

《Android開發藝術探索》–任玉剛
《第一行代碼》–郭霖

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