Android之Activity全方位解析

一、Activity的生命週期

1、典型的生命週期

在這張圖中,總共7種狀態:

onCreate()與onDestroy()對應,存在狀態

onStart()與onStop()對應,可見狀態

onResume()與onPause()對應,前臺狀態,即可以進行點擊操作等

而對於onRestart(),其執行具體過程:onStop() -> onRestart() -> onStart()

具體講解如下:

  • onCreate():當Activity第一次創建時就會被調用。這是生命週期的第一個方法,該方法中可以做一些初始化工作,如調用setContentView加載界面佈局資源。初始化Activity所需的數據。也可藉助onCreate()方法中的Bundle對象來恢復異常清空下Activity結束時的狀態。
  • onRestart():表示Activity正在重新啓動。一般情況下,噹噹前Activity從不可見重新變成可見狀態時,onRestart就會被調用。這種情況一般是用戶行爲導致的,如用戶按Home鍵切換到桌面或打開另外一個新的Activity,接着用戶回到這個Activity。
  • onStart():表示Activity正在被啓動,即將開始,這時Activity已經出現,但是還沒有出現在前臺,無法與用戶進行交互。該狀態可以被理解爲Activity已經顯示出來,但無法進行操作。
  • onResume():表示Activity已經可見了,並且出現在前臺並開始活動。和onStart()區別在於onStart:Activity在後臺運行,而onResume:Activity顯示在前臺。
  • onPause():表示Activity正在停止,仍可見,正常情況下,緊接着onStop會被調用。特殊情況下,如果這個時候快速回到當前Activity,那麼onResume就會被調用。注意:onPause不能進行耗時操作,會影響到新Activity的顯示。因爲onPause必須執行完,新的Activity的onResume纔會執行
  • onStop():表示Activity即將停止,不可見,位與後臺。可以做稍微重量級的回收工作,同樣不能太耗時。
  • onDestroy():表示Activity即將銷燬,這是Activity生命週期的最後一個回調,可以做一些回收工作和最終的資源回收

生命週期的幾種普通情況

①針對一個特定的Activity,第一次啓動,回調如下:onCreate()->onStart()->onResume()

②用戶打開新的Activiy的時候,上述Activity的回調如下:onPause()->onStop()

③再次回到原Activity時,回調如下:onRestart()->onStart()->onResume()

④按back鍵回退時,回調如下:onPause()->onStop()->onDestory()

⑤按Home鍵切換到桌面後又回到該Actitivy,回調如下:onPause()->onStop()->onRestart()->onStart()->onResume()

⑥調用finish()方法後,回調如下:onDestory()(以在onCreate()方法中調用爲例,不同方法中回調不同,通常都是在onCreate()方法中調用)

2、特殊情況下的生命週期

  • 橫豎屏切換

在橫豎屏切換的過程中,會發生Activity被銷燬並重建的過程。

在瞭解該情況的生命週期時,需先了解這兩個回調:onSaveInstanceState和onRestoreInstanceState。

在Activity由於異常情況下終止時,系統會調用onSaveInstanceState來保存當前activity的狀態。該方法的調用在onStop之前,但與onPause的調用沒有既定的前後順序(注意:只在Activity被異常終止時調用)。

異常終止Activity被重建時,系統會調用onRestoreInstanceState,並把Activity銷燬時onSaveInstanceState方法所保存的Bundle對象參數同時傳遞給onRestoreInstanceState和onCreate

因此,可以通過onRestoreInstanceState方法來恢復Activity狀態,該方法的調用在onStart之後

onRestoreInstanceState和onCreate區別onRestoreInstanceState回調則表明其Bundle對象不爲空無需判斷。而onCreate需加判斷,因而建議使用onRestoreInstanceState

橫豎屏切換的生命週期:

onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

通過AndroidManifest文件的Activity中指定如下屬性:

android:configChanges="orientation|screenSize"複製代碼

來避免橫豎屏切換時,Activity的銷燬和重建,而是回調如下方法:

@Override
public void onConfigurationChanged(Configuration newConfig){
   super.onConfigurationChanged(newConfig);
}
  • 資源內存不足導致低優先級的Activity被殺死

(1)前臺Activity:正在和用戶交互的Activity,優先級最高

(2)可見但非前臺Activity:如Activity中彈出了一個對話框,導致Activity可見但位與後臺無法和用戶交互

(3)後臺Activity:已經被暫停的Activity,比如執行了onStop,優先級最低

內存不足時,會按照上述優先級從低到高取殺死目標Activity所在的進程。

二、Activity的啓動模式

1、啓動模式的類別:

四種:

  • standard:不會檢查返回棧中是否存在該Activity,直接創建新的Activity存入棧頂
  • singleTop:檢查棧頂是否存在該Activity,存在則直接使用,否則創建
  • singleTask:檢查返回棧中是否存在該Activity,存在將其上的Activity出棧,使用該Activity。否則創建
  • singleInstance:新建一個返回棧,存放該Activity。

2、啓動模式的結構——棧

Activity的管理是採用任務棧的形式,任務棧採用“後進先出”的棧結構

3、特殊情況——前臺棧和後臺棧的交互

假如目前有兩個任務棧。前臺任務棧爲AB,後臺任務棧爲CD,這裏假設CD的啓動模式均爲singleTask,現在請求啓動D,那麼這個後臺的任務棧都會被切換到前臺,這個時候整個後退列表就變成了ABCD。當用戶按back返回時,列表中的activity會一一出棧,如下圖。

如果不是請求啓動D而是啓動C,那麼情況又不一樣,如下圖。

調用SingleTask模式的後臺任務棧中的Activity,會把整個棧的Actvity壓入當前棧的棧頂。singleTask會具有clearTop特性,把之上的棧內Activity清除。

4、Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK:與“singleTask”對應
  • FLAG_ACTIVITY_SINGLE_TOP:與“singleTop”對應
  • FLAG_ACTIVITY_CLEAR_TOP:當具有該標記的Activity啓動時,在同一個任務棧中所有位與它上面的Activity都要出棧。這個模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。在這種情況下,被啓動Activity的實例如果已經存在,那麼系統就會調用它的onNewIntent。如果被啓動的Activity採用standard模式啓動,那麼它連同它之上的Activity都會出棧,系統會創建新的Activity實例放入棧頂。與“singleTask”對應
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有該標記的Activity不會出現在歷史Activity的列表中,當某些情況下我們不希望用戶通過歷史列表回到我們的Activity的時候該標記比較有用。其等效於在XML中指定Activity的屬性android:excludeFromRecents="true"

今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章