Android四大組件之Activity
1、Activity生命周期
一般情況下Activity會經(jīng)歷如下生命周期:
為了方便先上一下官方的Activity生命周期圖解

(1)onCreate(): 表示activity正在被創(chuàng)建,是activity的第一個(gè)生命周期,在這期間進(jìn)行頁面的初始化,setContenView()加載頁面布局資源、初始化一些變量等工作。
(2)onStart(): 表示activity正在啟動,這個(gè)時(shí)候已經(jīng)可見,但是還未出現(xiàn)在前臺,不能和用戶進(jìn)行交互。這個(gè)時(shí)候activity已經(jīng)出來了但我們看不到。
(3)onResume(): 表示activity已經(jīng)可見了,位于前臺了,可以和用戶進(jìn)行交互。和onStart的相同點(diǎn)和區(qū)別:onStart和onResume時(shí)期Activity都已可見,但onStart不在前臺,不能與用戶進(jìn)行交互,而onResume已在前臺,可以和用戶進(jìn)行交互。
(4)onPause(): 表示activity正在暫停,正常情況下緊接著就執(zhí)行onStop,這期間可以進(jìn)行一些動畫停止、數(shù)據(jù)存儲工作。但不能耗時(shí),否則會影響新activity的啟動。因?yàn)閱有耡ctivity時(shí),執(zhí)行onPause()后就會執(zhí)行新Activity的onCreate
(5)onStop(): 表示activity即將停止,這期間可以做一些重量級的回收工作。但不能太耗時(shí)
(6)onDestroy(): 表示activity即將被銷毀,這是activity最后一個(gè)生命周期,這期間可以做一些回收工作和資源回收。
(7)onRestart(): 表示activity重新啟動,即從不可見狀態(tài)變?yōu)榭梢姞顟B(tài)時(shí)就會被調(diào)用,一般情況下都是用戶操作才會調(diào)用,例如用戶操作Home鍵或者啟動一個(gè)新頁面,舊頁面會執(zhí)行onPause和onStop,然后再回到舊頁面,這時(shí)就會調(diào)用onRestart,然后再調(diào)用onStart和onResume
2、Activity啟動模式
- 2.1、standard Activity默認(rèn)的啟動模式,每次啟動Activity都會創(chuàng)建一個(gè)新的實(shí)例,放入任務(wù)棧中。這是一個(gè)典型的多實(shí)例,每一個(gè)任務(wù)??梢杂卸鄠€(gè)Activity,每個(gè)Activity可以屬于多個(gè)任務(wù)棧。哪個(gè)Activity啟動了當(dāng)前Activity,當(dāng)前Activity就放入改Activity所在的任務(wù)棧。比如
Activity A啟動了Activity B,那么Activity B就位于Activity A所在的任務(wù)棧中。此模式下onCreate()、onStart()、onResume()都會執(zhí)行。

- 2.2、singleTop 棧頂復(fù)用模式,啟動的Activity位于棧頂時(shí)則會通過調(diào)用onNewItent()方法復(fù)用原來的Activity,不再創(chuàng)建一個(gè)新的實(shí)例。否則會像standard模式那樣。一句話概述就是:當(dāng)且僅當(dāng)啟動的 Activity 和上一個(gè) Activity 一致的時(shí)候才會通過調(diào)用 onNewIntent() 方法重用 Activity 。使用場景:資訊閱讀類 APP 的內(nèi)容界面。

- 2.3 singleTask 棧內(nèi)復(fù)用模式,當(dāng)啟動的Activity位于棧內(nèi)時(shí),就會通過調(diào)用onNewItent()方法復(fù)用當(dāng)前的Activity,如果當(dāng)前Activity上面還有其他Activity,同時(shí)會將其他Activity從棧內(nèi)移出。如果棧內(nèi)不存在當(dāng)前Activity,則和standard模式一樣。即: A ->B -> C -> D -> B,此時(shí)棧內(nèi)變成了 A -> B。而 A -> B -> C,棧內(nèi)還是 A -> B -> C。使用場景:瀏覽器的主頁面,或者大部分 APP 的主頁面。

- 2.4 singleInstance 單實(shí)例模式,是一個(gè)加強(qiáng)版的singleTask,除了擁有singleTask的特性外,此種模式下Activity單獨(dú)在一個(gè)任務(wù)棧中,依然是調(diào)用 onNewIntent() 方法。

到這里Activity啟動模式就要說完了,其實(shí)還有一點(diǎn)與其相聯(lián)系的知識,那就是Inent標(biāo)簽
在 Android 中,我們除了在清單文件 AndroidManifest.xml 中配置 launchMode,當(dāng)然可以用 Intent 標(biāo)簽說事兒。啟動 Activity ,我們需要傳遞一個(gè) Intent,完全可以通過設(shè)置 Intent.setFlags(int flags) 來設(shè)置啟動的 Activity 的啟動模式。
需要注意的是:通過代碼來設(shè)置 Activity 的啟動模式的方式,優(yōu)先級比清單文件設(shè)置更高。
FLAG_ACTIVITY_NEW_TASK
這個(gè)標(biāo)識會使新啟動的 Activity 獨(dú)立創(chuàng)建一個(gè) Task。
FLAG_ACTIVITY_CLEAR_TOP
這個(gè)標(biāo)識會使新啟動的 Activity 檢查是否存在于 Task 中,如果存在則清除其之上的 Activity,使它獲得焦點(diǎn),并不重新實(shí)例化一個(gè) Activity,一般結(jié)合 FLAG_ACTIVITY_NEW_TASK 一起使用。
FLAG_ACTIVITY_SINGLE_TOP
等同于在 launcherMode 屬性設(shè)置為 singleTop。