Activity 生命周期并不僅僅在用戶運行應用程序之后才開始生效,事實上它也影響著用戶切出以及切回應用時得到的不同反饋。當我們開發(fā)一款應用時,首先需要牢記一點:用戶會經常在執(zhí)行過程中、在我們的應用與其它應用之間頻繁切換。
介紹 Activity 生命周期并不僅僅在用戶運行應用程序之后才開始生效,事實上它也影響著用戶切出以及切回應用時得到的不同反饋。當我們開發(fā)一款應用時,首先需要牢記一點:用戶會經常在執(zhí)行過程中、在我們的應用與其它應用之間頻繁切換。取決于用戶的操作方式,同一款應用程序有時在前臺運行、有時則在后臺運行。大家必須保證自己的應用能夠就會這類情況,并在此類切換過程中及時保存并恢復數(shù)據(jù)。再次提醒各位,這一過程對于某些特定應用程序略有不同——例如功能性組件。
1.回調方法 第一步 為了控制 Activity 處于不同狀態(tài)下時應用程序的運行方式,例如當用戶切出或者切回應用,大家可以選擇多種處理方法。這類方法也就是 Activity 生命周期回調方法。Android 系統(tǒng)會在我們的 Activity 進入某種特定狀態(tài)后調用這些方法,從而通過一系列步驟確保我們的應用程序能夠繼續(xù)起效、不至于丟失數(shù)據(jù)而且在用戶不與之交互時不會使用非必要性資源。每一種回調方法都會讓我們的應用進入一種可能的狀態(tài)。
如果大家之前曾經接觸過 Java 應用程序的編程工作,那么應該已經發(fā)現(xiàn) Android 應用程序的啟動遵循另一種方式。與 Java 應用直接使用主方法不同,Android 在啟動后會首先執(zhí)行主 Activity 類中的 onCreate 方法。請記住,我們已經在清單中將該類指定為主啟動 Activity。Activity 會首先回調 onCreate 方法,相當于重復用戶啟動應用程序后的流程。這時候 onCreate 方法會使應用程序進入 Created 狀態(tài)。
開發(fā)者指南當中通過示意圖以直觀方式介紹了生命周期、回調方法以及狀態(tài)的概念。其中 onResume 方法負責提供 Resumed 狀態(tài),這時我們的應用程序可以接受用戶的直接操作。其它各類回調方法都以 onResume 為核心,即將應用程序引導至 Resumed 狀態(tài)或者從該狀態(tài)脫離、啟動該狀態(tài)或者將其停止。
對于大部分應用程序來說,我們只需要使用一部分回調方法,但最起碼要用到 onCreate。雖然使用頻率不高,但了解全部回調及狀態(tài)的作用將幫助我們了解自己的應用程序在運行及停止運行時,Android 系統(tǒng)會受到怎樣的影響。一般情況下,大家需要保證用戶能夠在任何操作過程切換出去之后、都能順利恢復到之前的運行狀態(tài);如果他們通過導航選擇前進或者后退,應用則需保存全部必要數(shù)據(jù)并釋放不必要占用的硬件資源。
第二步 我們的應用程序可能處于以下五種狀態(tài),分別為:Created、Started、Resumed、Paused 以及 Stopped。另有七種回調方法能夠讓應用進入或者脫離上述狀態(tài),它們分別是:onCreate、onStart、onRestart、onResume、onPause、onStop 以及 onDestroy。這些方法能夠讓我們的應用程序在可能的狀態(tài)之間進行切換,而且某些情況下切換速度會很快。通常來說,大家可以認為自己的應用程序始終處于 resumed、paused 或者 stopped 這三種狀態(tài)之下,因為其它狀態(tài)都是暫時性的。
當我們的應用程序正處于運行當中且用戶與之進行操作交互,這時的應用狀態(tài)為 Resumed;當另一個 Activity 處于前臺但僅僅使我們的應用被部分隱藏時,這時的應用狀態(tài)為 Paused——在這種狀態(tài)下用戶無法再與應用進行交互。當我們的應用完全處于后臺之下,而且用戶既無法操作、也無法觀看到它時,其狀態(tài)即為 Stopped。在這種狀態(tài)下 Activity 會保留之前的所有數(shù)據(jù),但無法加以執(zhí)行。
2.進入 Resumed 狀態(tài) 如我們所知,主 Activity 會在應用程序啟動時開始運行,onCreate 方法也將執(zhí)行、從而讓我們準備該類所需要的 Activity UI 以及全部數(shù)據(jù)條目。我們創(chuàng)建的大部分應用當中都包含不只一個 Activity,其它 Activity 會在用戶與應用程序進行操作交互時啟動。大家可以利用以下代碼通過 Intent 類啟動另一個非主 Activity:
這代表著應用程序包中另一個名為“About”的 Activity 類。大家可以通過選擇自己的源碼包而后選擇“文件”、“新建”、“類”的方式在 Eclipse 當中創(chuàng)建一個新 Activity,而后將該 Android Activity 類選定為超級類。請記住,每一個 Activity 都必須在我們的應用程序清單當中列出。大家還可以利用 Intent 類實現(xiàn)不同 Activity 之間的數(shù)據(jù)轉移。
當一個 Activity 處于運行當中時,onCreate 方法也在同時執(zhí)行,因此除了把其它 Activity 類列入清單之外、大家也能夠以與主 Activity 類似的方式在應用程序當中處理這些類。我們也可以為每個 Activity 創(chuàng)建一個布局文件,并通過設置讓其使用與主 Activity 同樣的技術機制。
在某個 Activity 的 onCreate 方法開始執(zhí)行之后,onStart 與 onResume 兩個方法也將開始執(zhí)行, 從而使該 Activity 處于 Resumed 狀態(tài)、并在后續(xù)執(zhí)行過程中根據(jù)情況轉換為 Created 以及 Started 狀態(tài)。
我們的 Activity 可以通過不只一種方式進入 Resumed 狀態(tài),應用程序啟動只是其中最基本的途徑。如果 Activity 處于 Paused 或者 Stopped 狀態(tài),則應用程序切換至當前之后該 Activity 將直接進入前臺運行模式,且無需重復調用 onCreate 方法。如果大家的應用從 Paused 狀態(tài)切換回 Resumed 狀態(tài),則 Activity 的 onResume 方法將開始執(zhí)行。如果該應用由 Stopped 狀態(tài)切換回運行狀態(tài),則執(zhí)行 onRestart 方法、而后依次為 onStart 與 onResume 方法。
3.進入 Destroyed 狀態(tài) 第一步 當我們的應用程序處于退出或者隱藏狀態(tài)下,則 Resumed 就會轉變?yōu)?Destroyed。這時候,onPause 方法會將應用的 Activity 由運行時的 Resumed 狀態(tài)轉換為 Paused 狀態(tài)。在 onPause 當中,大家應當停止任何需要占用資源的任務,例如動畫播放、傳感器數(shù)據(jù)處理以及廣播接收等等。如果 onPause 正在執(zhí)行,那么 onStop 也可以開始執(zhí)行,因為用戶此時通常已經通過導航退出了我們的應用程序。大家還可以利用 onPause 方法進行數(shù)據(jù)保存——雖然通常來說數(shù)據(jù)保存工作由 onStop 方法來負責最為妥當。
正如我們之前曾經提到,大家的 Activity 能夠通過 onResume 方法從 Paused 狀態(tài)重新回歸至 Resumed 狀態(tài)。這意味著我們可以利用 onResume 來恢復任何我們之前在 onPause 當中停止或者發(fā)布過的內容。不過大家還需要記住一點,onResume 在其它情況下也會付諸執(zhí)行,例如在應用程序啟動時。
第二步 在 onPause 之后,如果應用程序進入 Stopped 狀態(tài),那么 onStop 也將開始執(zhí)行。在這種情況下,onRestart、onStart 以及 onResume 等方法仍然能夠使應用程序重新回到 Resumed 狀態(tài)。在 onStop 中,大家應當盡可能壓縮只在必要數(shù)據(jù)的操作量,例如向數(shù)據(jù)庫中寫入內容。請大家確保在 onStop 當中囊括了所有應用程序所使用的資源,從而避免該應用在被徹底關閉之后導致內存溢出問題。
這套系統(tǒng)會在應用程序從 resumed 狀態(tài)切換至 stopped 狀態(tài)后保存特定數(shù)據(jù),例如視圖中需要顯示的內容。當某個 Activity 從 Stopped 狀態(tài)恢復到 Resumed 狀態(tài)時,onRestart、onStart 以及 onResume 方法都會開始執(zhí)行。不過 onStart 與 onResume 的執(zhí)行情況有所不同——例如在應用程序啟動之時。而 onRestart 方法只會在應用程序從 Stopped 狀態(tài)恢復至前臺之后才會執(zhí)行,這樣大家就能利用它來恢復任何保存在 onStop 當中的運行內容。
提示:當大家從一個 Activit 之下啟動另一個 Activity 時,前者會進入 Stopped 狀態(tài)。如果用戶隨后利用后退按鈕再次由后者返回先前的 Activity 當,那么前者的 onRestart 方法就會開始執(zhí)行。
第三步 如果大家的應用程序即將徹底關閉,例如我們的當前 Activity 被從系統(tǒng)當中移除,則 onDestroy 方法會開始執(zhí)行。盡管這是在我們的 Activity 完全消失之前執(zhí)行的最后一個方法,大家仍然不應該簡單地將所有內容一股腦清除。事實上,我們需要利用 onStop 或者 onPause 來處理結束工作。當然也有例外情況,如果應用程序的后臺進程仍然處于運行狀態(tài),那么這時候大家應該在 onDestroy 當中將其停止。
在 onDestroy 執(zhí)行之后,如果用戶通過導航返回應用程序 Activity,則對應 onCreate 方法將再次被啟動。一般情況下,大家可以假設 onPause 與 onStop 會在 onDestroy 之前執(zhí)行。不過如果大家明確調用 finish 方法來結束一個 Activity,則只有 onDestroy 會被執(zhí)行。
在多數(shù)情況下,我們并不需要為應用程序當中的生命周期回調問題投入過多精力,因為大家完全可以利用 onCreate 方法的參數(shù)實現(xiàn)數(shù)據(jù)保留效果。在 Activity onCreate 方法當中,Bundle 參數(shù)負責如前所述自動進行視圖信息保存。不過大家也可以利用該對象保存更多數(shù)據(jù)內容,例如記錄用戶與應用程序之間的交互所產生的變量更新。要實現(xiàn)這一目標,大家可以在 Activity 類當中使用 onSaveInstanceState 方法,完成數(shù)據(jù)鍵值對的編寫之后、我們就可能在 onCreate 當中將其恢復。
提示:當用戶改變設備顯示模式時,也就是在縱向及橫向模式間進行切換,我們的 Activity 實際上會經歷重新創(chuàng)建、onCreate 也會被再次執(zhí)行。這一過程被我們稱為配置變化。在這種情況下,系統(tǒng)會假設大家需要重新創(chuàng)建 Activity,例如大家在每種顯示模式下使用不同的布局方案。不過在多數(shù)情況下,大家可能不希望系統(tǒng)照此辦理。為了避免我們的 Activity 在顯示模式轉換時發(fā)生重新創(chuàng)建,大家可以從兩種解決方式中作出選擇:向清單內的 Activity 添加“android:configChanges”屬性,或者調整我們的 Activity 結構、利用我們在配置變量時所保留的 Fragments。
總結 當大家開始學習如何為 Android 平臺開發(fā)應用程序時,Activity 當中所涉及的大量狀態(tài)與回調方法可能會成為很多難題乃至混亂的根源。然而在大多數(shù)情況下,我們只需要采用最低數(shù)量的方法以確保自己的應用程序有能力提供用戶所預期的功能與效果。在本系列教程的下一篇當中,我們將共同了解部分常用 Android 類,大家很可能會在自己的第一款應用當中與它們打交道。在此之后,我們將著眼于 Android 代碼示例、需要了解的應用程序發(fā)布知識以及其它一些關于今后進一步學習的建議。
原文鏈接:
http://mobile.tutsplus.com/tutorials/android/android-sdk-activities-lifecycle/