Android四大組件之Activity

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í)行。
image.png
  • 2.2、singleTop 棧頂復用模式,啟動的Activity位于棧頂時則會通過調(diào)用onNewItent()方法復用原來的Activity,不再創(chuàng)建一個新的實例。否則會像standard模式那樣。一句話概述就是:當且僅當啟動的 Activity 和上一個 Activity 一致的時候才會通過調(diào)用 onNewIntent() 方法重用 Activity 。使用場景:資訊閱讀類 APP 的內(nèi)容界面。
image.png
  • 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 的主頁面。
image.png
  • 2.4 singleInstance 單實例模式,是一個加強版的singleTask,除了擁有singleTask的特性外,此種模式下Activity單獨在一個任務棧中,依然是調(diào)用 onNewIntent() 方法。
image.png

到這里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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容