注:現(xiàn)已有很多文章可供學(xué)習(xí),本人的文章也只是學(xué)習(xí)時的記錄,會盡量附上每個知識點的來源,若有遺漏請見諒。
本編會先圍繞Activity是什么、為什么、怎么用的角度來介紹Activity。同時會對Activity的生命周期、啟動模式、啟動流程等Activity相關(guān)內(nèi)容進(jìn)行介紹。本篇內(nèi)容目錄如下:
- Activity是什么?
- 為什么需要Activity?
- Activity怎么使用?
- Activity的生命周期
- Activity的啟動模式
- Activity的啟動流程
一、Activity是什么?
Activity是一個Android應(yīng)用程序的組件。Activity類會創(chuàng)建了一個窗口,開發(fā)者可以通過setContentView(View)的接口把UI放到給窗口上。
二、為什么需要Activity?
因為Activity可以提供窗口,且Activity都是獨立平等的,所以Activity可以用來處理用戶操作。幾乎所有的activity都是用來和用戶交互的。
三、Activity怎么使用?
step1:新建一個類,并繼承AppCompatActivity類或Activity類。與Activity類不同的是,AppCompatActivity默認(rèn)帶標(biāo)題欄,在v7包,且Android studio的工程也是默認(rèn)繼承AppcompatActivity類。
step2:重寫方法onCreate()。
step3:用setContentView()方法設(shè)置在該Activity上顯示的布局文件。
step4:最后一定要在AndroidManifest配置文件聲明該Activity, 如果是主活動需要加上 intent-filter標(biāo)簽。
intent-filter的規(guī)則和使用之后會在intent學(xué)習(xí)中補(bǔ)上。
四、Activity的生命周期
首先,Activity的生命周期分為兩種。
- 典型情況下的生命周期
- 異常情況下的生命周期
- 典型情況下的生命周期。

- onCreate:在首次創(chuàng)建 Activity 時調(diào)用。主要用于創(chuàng)建視圖、初始化等靜態(tài)設(shè)置。同時,系統(tǒng)向此方法傳遞一個Bundle 對象,該Bundle 對象記錄了Activity上一狀態(tài)的參數(shù),不過需要在上一次關(guān)閉Activity前記錄,而后會調(diào)用onStart方法。
- onStart:即將Activity對用戶可見但不能交互,因為還沒獲取到焦點。
- onResume:在 Activity 即將開始與用戶進(jìn)行交互之前調(diào)用。 此時,Activity 處于 Activity 堆棧的頂層,并具有用戶輸入焦點。
- onPause:停止Activity與用戶的交互,失去焦點。 此方法通常用于對持久性數(shù)據(jù)的保存、停止動畫以及其他可能消耗 CPU 等內(nèi)容。
- onStop:在 Activity 對用戶不再可見時調(diào)用。而后如果 Activity 恢復(fù)與用戶的交互,則會調(diào)用 onRestart 方法,如果 Activity 被銷毀,則會調(diào)用onDestroy方法。
- onRestart:在Activity被停止后再次啟動時調(diào)用(即屏幕熄滅后再次回到app,按下home鍵后再次回到app),而后會調(diào)用onStart方法。
- onDestroy:在 Activity 被銷毀前調(diào)用,這是 Activity 收到的最后調(diào)用。 當(dāng) Activity 結(jié)束(對 Activity 調(diào)用了 finish 方法),或系統(tǒng)為節(jié)省空間而暫時銷毀該 Activity 實例時,可能會調(diào)用它。 你可以通過 isFinishing和isDestroy() 方法區(qū)分這兩種情形。
- 異常情況下的生命周期。 (Activity被銷毀重建或Activity重新打開)

- onSaveInstanceState:當(dāng)某項Activity被銷毀時,Activity 對象也會被銷毀,為了讓用戶并對系統(tǒng)銷毀后又重建的Activity無感知。 你可以在onSaveInstanceState方法對有關(guān)Activity狀態(tài)的信息進(jìn)行保存,以確保有關(guān)Activity狀態(tài)的重要信息得到保留。
調(diào)用時機(jī):當(dāng)用戶按下HOME鍵時、長按HOME鍵,選擇運行其他的程序時、按下電源按鍵(關(guān)閉屏幕顯示)時、從activity A中啟動一個新的activity時、屏幕方向切換時,例如從豎屏切換到橫屏?xí)r。
- onRestoreInstanceState 或者 onCreate:系統(tǒng)會先調(diào)用onSaveInstanceState方法,然后銷毀 Activity。系統(tǒng)會向該方法傳遞一個Bundle 對象,你可以在其中使用putString 和 putInt 等方法以鍵-值對形式保存有關(guān) Activity 狀態(tài)的信息。然后,如果系統(tǒng)終止您的應(yīng)用進(jìn)程,并且用戶返回您的 Activity,則系統(tǒng)會重建該 Activity,并將Bundle同時傳遞給onCreate和onRestoreInstanceState。您可以使用上述任一方法從Bundle 提取您保存的狀態(tài)并恢復(fù)該 Activity 狀態(tài)。如果沒有狀態(tài)信息需要恢復(fù),則傳遞給您的Bundle是空值(如果是首次創(chuàng)建該 Activity,就會出現(xiàn)這種情況)。
解析流程圖:可以看到,從Activity running開始走,Activity 重獲用戶焦點時可保持狀態(tài)完好。恢復(fù)數(shù)據(jù)的方式跟隨生命周期的不同有兩種情況。
- 系統(tǒng)在銷毀 Activity 后重建 Activity,Activity 必須恢復(fù)之前保存的狀態(tài)。
- 系統(tǒng)停止 Activity 后繼續(xù)執(zhí)行 Activity,并且 Activity 狀態(tài)保持完好。
參考資料與詳解:
Android Activity生命周期詳解
Activity的啟動模式
- 首先,先給大家介紹一下任務(wù)棧是什么?
任務(wù)棧是一個Activity的集合,它使用棧的方式來管理其中的Activity,這個棧又被稱為返回棧(back stack),棧中Activity的順序就是按照它們被打開的順序依次存放的。
- 啟動模式
standard(默認(rèn)啟動模式)
standard是默認(rèn)的啟動模式,即如果不指定launchMode屬性,則自動就會使用這種啟動模式。這種啟動模式表示每次啟動該Activity時系統(tǒng)都會為創(chuàng)建一個新的實例,并且總會把它放入到當(dāng)前的任務(wù)當(dāng)中。聲明成這種啟動模式的Activity可以被實例化多次,一個任務(wù)棧當(dāng)中也可以包含多個這種Activity的實例。
singleTop
在這種啟動模式下,如果要啟動的這個Activity在當(dāng)前任務(wù)中已經(jīng)存在了,并且還處于棧頂?shù)奈恢?,那么系統(tǒng)就不會再去創(chuàng)建一個該Activity的實例,而是調(diào)用棧頂Activity的onNewIntent()方法。如果不在棧頂則創(chuàng)建一個該Activity的實例,因此聲明成這種啟動模式的Activity也可以被實例化多次,一個任務(wù)當(dāng)中也可以包含多個這種Activity的實例。
singleTask
在這種啟動模式下,如果現(xiàn)有任務(wù)當(dāng)中已經(jīng)存在一個該Activity的實例了,那么系統(tǒng)就不會再創(chuàng)建一次它的實例,而是會直接調(diào)用它的onNewIntent()方法(會將該任務(wù)棧的該activity之上的所有activity全部彈出棧)。聲明成這種啟動模式的Activity,在同一個任務(wù)當(dāng)中只會存在一個實例。
singleInstance
在這種啟動模式下,若還沒有該Activity實例則會創(chuàng)建一個新的任務(wù)棧,將該Activity實例單獨放在任務(wù)棧中,且此任務(wù)棧中只有唯一一個實例。
- 如何定義啟動模式
1.使用manifest文件
當(dāng)你在manifest文件中聲明一個Activity的時候,你可以指定這個Activity在啟動的時候該如何與任務(wù)進(jìn)行關(guān)聯(lián)。
2.使用Intent flag
當(dāng)你調(diào)用startActivity()方法時,你可以在Intent中加入一個flag,從而指定新啟動的Activity該如何與當(dāng)前任務(wù)進(jìn)行關(guān)聯(lián)。
參考資料與詳解:
Android任務(wù)棧的完全解析