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

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

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

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

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

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