1. 程式人生 > >Activity生命週期和任務棧

Activity生命週期和任務棧

一、Activity生命週期

onCreate():首次建立 Activity 時呼叫。 您應該在此方法中執行所有正常的靜態設定— 建立檢視、將資料繫結到列表等

onRestart():在 Activity 已停止並即將再次啟動前呼叫。

onStart():在 Activity 即將對使用者可見之前呼叫。

onResume():在 Activity 即將開始與使用者進行互動之前呼叫。 此時,Activity 處於 Activity 堆疊的頂層,並具有使用者輸入焦點。

onPause():當系統即將開始繼續另一個 Activity 時呼叫。 此方法通常用於確認對永續性資料的未儲存更改(向儲存裝置儲存使用者編輯內容)、停止動畫以及其他可能消耗 CPU 的內容

onStop():Activity 對使用者不再可見時呼叫。如果 Activity 被銷燬,或另一個 Activity(一個現有 Activity 或新 Activity)繼續執行並將其覆蓋,就可能發生這種情況。

onDestory():在 Activity 被銷燬前呼叫。當 Activity 結束(或有人呼叫finish()方法),或系統為節省空間而暫時銷燬該 Activity 例項時,可能會呼叫它,可以通過isfinishing()方法區分這兩種情況。

要點:

1.onCreate~onResume的過程中,Activity程序不會被系統終止,onPause~onDestory過程中,系統有可能終止Activity。

2.Activity A啟動Activity B時,Activity A進入到onPause狀態,當Activity B 執行onCreat~onResume之後,Activity A才進入onStop,這是由於在Activity啟動之前,會檢查棧頂Activity要先onPause之後才會啟動新Activity。

根據以上兩點,得知不要在onPause中進行費時操作,否則會妨礙下一個Activity的體驗。

二、儲存Activity狀態

Activity進入後臺可能會被系統回收,或者橫豎螢幕切換可能被銷燬,這時可以通過onSaveInstanceState()儲存Activity的狀態資訊。當出現上述情況,系統會呼叫
onSaveInstanceState(),在這個方法中傳遞一個Bundle,可以使用putString()和putInt()方法以鍵值對的形式儲存資訊。當重新啟動Activity時,在onCreate和onRestoreInstanceState方法中有存在一個Bundle可以恢復Activity狀態。

三、Activity任務棧

1.使用Intent的flag標誌,可以修改或定義Activity的啟動模式,且優先順序最高。 2.當使用Intent的flag指定Activity的啟動模式,或者設定了Activity的allTaskReparenting屬性為true時,可以通過taskAffinity屬性設定Activity關聯。 3.清理返回棧,如果使用者長時間離開Activity,系統會系統清除返回棧,只留下根任務。這時,可以下修改屬性:

alwaysRetainTaskState:如果在任務的根 Activity 中將此屬性設定為 "true",則不會發生剛才所述的預設行為。即使在很長一段時間後,任務仍將所有 Activity 保留在其堆疊中。

clearTaskOnLaunch:如果在任務的根 Activity 中將此屬性設定為 "true",則每當使用者離開任務然後返回時,系統都會將堆疊清除到只剩下根 Activity。 

finishOnTaskLaunch:此屬性類似於 ,但它對單個 Activity 起作用,而非整個任務。 此外,它還有可能會導致任何 Activity 停止,包括根 Activity。 設定為 "true" 時,Activity 仍是任務的一部分,但是僅限於當前會話。如果使用者離開然後返回任務,則任務將不復存在。