重溫Android四大組件(一)—Activity的生命週期

前言

四大組件對於Android開發者是老生常談的知識了,相信每一個Android開發者對四大組件都已經很熟悉了。可是四大組件做爲Android應用的基礎,做爲開發者不只要熟悉並且要爛熟於心。android

這裏以《重溫Android四大組件》爲題目是爲了鞏固本身的Android基礎,加深對Android的認知。數據庫

Activity生命週期探索

Activity生命週期是Activity在不一樣場景下表現的一種狀態,在Android開發中的表現就是提供給開發者的生命週期函數。使用Activity生命週期函數的目的就是定義Activity在不一樣時期的表現。下圖是Android官方文檔中提供的Activity生命週期函數回調。在這張圖中能夠看到Activity在各類場景中的狀態變化。函數

  • onCreate() 表示Activity正在被建立。在系統首次建立時觸發,而且onCreate在整個Activity生命週期中只觸發一次。在onCreate中咱們能夠作一些初始化工做。動畫

  • onStart() 表示Activity正在啓動。此時Activity對用戶可見,而且正在準備進入前臺而且變得可交互。cdn

  • onReStart() 表示Activity正在從新啓動。通常來講Activity從後臺回到前臺時會調用onRestart方法。好比,用戶點擊home鍵將Activity放到後臺,而後返回應用。xml

  • onResume() 表示Activity已經進入到前臺,用戶能夠與Activity進行交互了。Activity將會停留在resume狀態直到有其它事件發生時Activity失去焦點,好比說用戶切換到其它Activity。對象

  • onPause() 表示Activity正在中止。也就是說某些事件發生致使用戶正在離開當前Activity。在onPause方法中能夠釋放一些系統資源,好比傳感器或者可能影響電池續航的一些行爲。可是須要注意的時不能再onPause中做耗時操做,由於在啓動其餘Activity時,執行過當前Activity的onPause方法後纔會執行新的Activity的onResume方法。blog

  • onStop() 表示Activity即將中止。此時Activity對用戶已是不可見的了,可是此時Activity對象依然在內存中。在onStop中能夠作一些稍微重量級的操做,好比數據庫操做、暫停動畫或者處理一些對用戶不可見的資源。生命週期

  • onDestroy() 表示Activity將要銷燬。這是Activity生命週期中的最後一個回調函數。在onDestroy方法中須要釋放全部資源。進程

Activity生命週期

Activity在不一樣場景中的生命週期狀態

(1)Activity被啓動並結束

觸發條件:用戶按下back鍵或者調用了Activity的finish方法。

這個簡單的場景是最常出現的。這個場景能夠概括爲:onCreate()->onStart()-onResume()->點擊返回鍵->onPause()->onStop()->onDestroy()

(2)用戶切換出當前應用

觸發條件:用戶按下HOME鍵或者在任務欄中切換到其它應用。

在這個場景中Activity被放到後臺,可是並無被銷燬,Activity實例依然在內存中,若是系統沒有回收進程,Activity實例會保有以前的狀態。這個場景能夠概括爲:onCreate()->onStart()-onResume()->點擊HOME鍵->onPause()->onStop()->onSaveInstanceState()->返回應用->onRestart()->onStart()->onResume()

(3)系統配置變化

觸發條件:好比:屏幕方向改變、鍵盤語言變化等。

在上述條件中,屏幕方向改變應該是最多見的現象。系統配置的改變會致使Activity的銷燬以及重建。生命週期變化是:onCreate()->onStart()->onResume()->屏幕方向變化->onPause()->onStop()->onSaveInstanceState()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。

能夠看到在屏幕方向變化期間,Activity經歷了銷燬和重建兩個過程。能夠注意到在這期間有兩個方法被調用到,它們分別是onSaveInstanceState和onRestoreInstanceState,這兩個方法時用來恢復Activity狀態使用的,經過Bundle傳遞參數。

在上面的狀況中,因爲Bundle沒法傳遞大量的數據,開發者能夠選擇本身處理系統配置變化。在AndroidManifest.xml文件中改變Activity的配置。好比,處理屏幕方向改變能夠加入配置:android:configChanges="orientation"。這個時候屏幕方向改變是就會調用onConfigurationChanged方法。此時的生命週期變化是:onCreate()->onStart()->onResume()->屏幕方向變化->onConfigurationChanged()。

能夠看到,若是開發者本身處理系統配置改變,那麼Activity就不會銷燬重建了,而是直接調用onConfigurationChanged方法。

(4)啓動模式對生命週期的影響

咱們知道Activity有4中啓動模式,分別是standard(標準模式)、singleTop(棧頂複用模式)、singleTask(棧內複用模式)、singleInstance(單實例模式)。啓動模式不一樣也會致使Activity生命週期不一樣的變化。

  • standard(標準模式):標準模式下的Activity在每次啓動時都會建立新的Activity實例,它的生命週期跟上面圖中所示相差無幾。

  • singleTop(棧頂複用模式):在這種模式下的Activity若是處於Activity棧棧頂,那麼會複用Activity實例,啓動的時候就會調用onNewIntent()->onRestart()->onStart()->onResume()。若是不是處於棧頂就會調用onCreate()->onRestart()->onStart()->onResume()。

  • singleTask(棧內複用模式):在這個模式下的Activity只要在Activity棧內存在實例就會複用這個實例,那個生命週期變化是:onNewIntent()->onRestart()->onStart()->onResume()。

  • singleInstance(單實例模式):在這種模式下Activity單獨存在一個Activity棧中,啓動調用onCreate()->onRestart()->onStart()->onResume()

經過Activity生命週期函數記錄Activity狀態

在上面的系統配置變化的例子中能夠看到Activity中提供了記錄狀態的方法。onSaveInstanceState以及onRestoreInstanceState,這兩個方法都是用Bundle。除此以外咱們還能看到在onCreate方法中也有一個Bundle類型的參數,這個Bundle就是保存的狀態的載體。

咱們知道Activity會因爲一些行爲被銷燬,好比,退出Activity。這些正常的操做會銷燬Activity實例,而且系統不會保有Activity的狀態。還有一種狀況是當Activity處於後臺時,因爲內存問題會被系統回收或者系統配置改變致使的銷燬重建,這個時候系統會保有Activity的狀態,就是Bundle存儲的數據,在Activity重建是會獲取到Bundle中的數據。

總結

在上面介紹了Activity在各類場景下的生命週期表現。理解這些生命週期的調用有利於在開發時更好的處理Activity與用戶的交互,同時也能避開一些常見的問題。
相關文章
相關標籤/搜索