生命週期三大循環
我們能監控Activity生命週期中的三個嵌套循環(monitor three nested loops in the activity lifecycle)
- 1.Activity的entire lifetime(全部的生命期)發生在調用onCreate()和調用onDestory()之間。
在onCreate()方法中執行全局狀態的建立(例如定義佈局),在onDestroy()方法中釋放所有保存的資源。
- 2.Activity的visible lifetime(可見的生命期)發生在調用onStart()和onStop()之間。
在這個期間,用戶能在屏幕上看見Activity,和它進行交互。
系統在Activity的完整壽命中可能多次調用onStart()和onStop(),正如Activity交替地對用戶可見或隱藏。
- 3.Activity的foreground lifetime (前臺的生命期)發生在調用onResume()和onPause()之間。
在這期間,Activity在屏幕上所有其他Activity的前面,有用戶輸入焦點。
一個Activity能頻繁的在前臺進入和出去之間轉變。
生命週期五種狀態
- 啓動狀態:Activity的啓動狀態很短暫,當Activity啓動後便會進入運行狀態。
- 運行狀態:Activity在此狀態時處於屏幕最前端,它是可見、有焦點的,可以與用戶進行交互。如單擊、長按等事件。即使出現內存不足的情況,Android也會先銷燬棧底的Activity,來確保當前的Activity正常運行。
- 暫停狀態:在某些情況下,Activity對用戶來說仍然可見,但它無法獲取焦點,用戶對它操作沒有沒有響應,此時它處於暫停狀態。
- 停止狀態:當Activity完全不可見時,它處於停止狀態,但仍然保留着當前的狀態和成員信息。如系統內存不足,那麼這種狀態下的Activity很容易被銷燬。
- 銷燬狀態:當Activity處於銷燬狀態時,將被清理出內存。
生命週期七種方法
- onCreate()方法:Activity首次創建時被調用。用於設置Activity的佈局文件,綁定按鈕監聽器等一些普通靜態操作。
- onStart()方法:在Activity即將可見時調用。
- onResume()方法:在Activity獲取焦點開始與用戶交互時調用。
- onPause()方法:在當前Activity被其他Activity覆蓋或鎖屏時調用。一般用於保存當前Activity中的數據。
- onStop()方法:在Activity對用戶不可見時調用。
- onDestroy()方法:調用Activity的finish()方法或Android系統資源不足時被調用。
- onRestart()方法:在Activity從停止狀態再次啓動時調用
onCreate和onStart之間有什麼區別?
- 可見與不可見的區別。前者不可見,後者可見。
- onCreate方法只在Activity創建時執行一次,而onStart方法在Activity中被多次調用。onCreate能做的事onStart其實都能做,但是onStart能做的事onCreate卻未必適合做。如前文所說的,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好。
onStart方法和onResume方法有什麼區別?
- 是否在前臺。onStart方法中Activity可見但不在前臺,不可交互,而在onResume中在前臺。
- 職責不同,onStart方法中主要還是進行初始化工作,而onResume方法,根據官方的建議,可以做開啓動畫和獨佔設備的操作。
onPause方法和onStop方法有什麼區別?
- 是否可見。onPause時Activity可見,onStop時Activity不可見,但Activity對象還在內存中。
- 在系統內存不足的時候可能不會執行onStop方法,因此程序狀態的保存、獨佔設備和動畫的關閉、以及一些數據的保存最好在onPause中進行,但要注意不能太耗時。
按鍵對生命週期的影響
BACK鍵
- 當我們按BACK鍵時,我們這個應用程序將結束,這時候我們將先後調用onPause()->onStop()->onDestory()三個方法。
- 再次啓動App時,會執行onCreate()->onStart()->onResume()
HOME鍵
- 按HOME的時候,Activity先後執行了onPause()->onStop()這兩個方法,這時候應用程序並沒有銷燬。
- 而當我們從桌面再次啓動應用程序時,則先後分別執行了onRestart()->onStart()->onResume()三個方法。
橫豎屏切換時Activity的生命週期
從豎屏--橫屏:從當前界面依次會走onPuse()--onStop()--onDestory()--onCreate()--onStart()--onResume()。可以看出豎屏會銷燬,橫屏會重新創建。