在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Android SDK 上手指南:Activity 與生命周期
Android SDK 上手指南:Java 應(yīng)用程序編程
Android SDK 上手指南:下一步學(xué)習(xí)方向
Android SDK 上手指南:用戶交互
Android SDK 上手指南:項目清單
Android SDK 上手指南:虛擬與物理設(shè)備
Android SDK 上手指南:Activity 與生命周期
Android SDK 上手指南:示例項目
剖析 Android SDK:Android 組件詳解
Android SDK 上手指南:應(yīng)用程序數(shù)據(jù)
Android SDK 上手指南:應(yīng)用程序資源
Android SDK 上手指南:應(yīng)用程序發(fā)布
Android SDK 上手指南:應(yīng)用程序結(jié)構(gòu)
Android SDK 上手指南:知識測試(1)
Android SDK 上手指南:用戶界面設(shè)計
Android SDK 上手指南:運行與調(diào)試

Android SDK 上手指南:Activity 與生命周期

Activity 生命周期并不僅僅在用戶運行應(yīng)用程序之后才開始生效,事實上它也影響著用戶切出以及切回應(yīng)用時得到的不同反饋。當(dāng)我們開發(fā)一款應(yīng)用時,首先需要牢記一點:用戶會經(jīng)常在執(zhí)行過程中、在我們的應(yīng)用與其它應(yīng)用之間頻繁切換。

介紹 Activity 生命周期并不僅僅在用戶運行應(yīng)用程序之后才開始生效,事實上它也影響著用戶切出以及切回應(yīng)用時得到的不同反饋。當(dāng)我們開發(fā)一款應(yīng)用時,首先需要牢記一點:用戶會經(jīng)常在執(zhí)行過程中、在我們的應(yīng)用與其它應(yīng)用之間頻繁切換。取決于用戶的操作方式,同一款應(yīng)用程序有時在前臺運行、有時則在后臺運行。大家必須保證自己的應(yīng)用能夠就會這類情況,并在此類切換過程中及時保存并恢復(fù)數(shù)據(jù)。再次提醒各位,這一過程對于某些特定應(yīng)用程序略有不同——例如功能性組件。

1.回調(diào)方法 第一步 為了控制 Activity 處于不同狀態(tài)下時應(yīng)用程序的運行方式,例如當(dāng)用戶切出或者切回應(yīng)用,大家可以選擇多種處理方法。這類方法也就是 Activity 生命周期回調(diào)方法。Android 系統(tǒng)會在我們的 Activity 進入某種特定狀態(tài)后調(diào)用這些方法,從而通過一系列步驟確保我們的應(yīng)用程序能夠繼續(xù)起效、不至于丟失數(shù)據(jù)而且在用戶不與之交互時不會使用非必要性資源。每一種回調(diào)方法都會讓我們的應(yīng)用進入一種可能的狀態(tài)。

如果大家之前曾經(jīng)接觸過 Java 應(yīng)用程序的編程工作,那么應(yīng)該已經(jīng)發(fā)現(xiàn) Android 應(yīng)用程序的啟動遵循另一種方式。與 Java 應(yīng)用直接使用主方法不同,Android 在啟動后會首先執(zhí)行主 Activity 類中的 onCreate 方法。請記住,我們已經(jīng)在清單中將該類指定為主啟動 Activity。Activity 會首先回調(diào) onCreate 方法,相當(dāng)于重復(fù)用戶啟動應(yīng)用程序后的流程。這時候 onCreate 方法會使應(yīng)用程序進入 Created 狀態(tài)。

開發(fā)者指南當(dāng)中通過示意圖以直觀方式介紹了生命周期、回調(diào)方法以及狀態(tài)的概念。其中 onResume 方法負(fù)責(zé)提供 Resumed 狀態(tài),這時我們的應(yīng)用程序可以接受用戶的直接操作。其它各類回調(diào)方法都以 onResume 為核心,即將應(yīng)用程序引導(dǎo)至 Resumed 狀態(tài)或者從該狀態(tài)脫離、啟動該狀態(tài)或者將其停止。

對于大部分應(yīng)用程序來說,我們只需要使用一部分回調(diào)方法,但最起碼要用到 onCreate。雖然使用頻率不高,但了解全部回調(diào)及狀態(tài)的作用將幫助我們了解自己的應(yīng)用程序在運行及停止運行時,Android 系統(tǒng)會受到怎樣的影響。一般情況下,大家需要保證用戶能夠在任何操作過程切換出去之后、都能順利恢復(fù)到之前的運行狀態(tài);如果他們通過導(dǎo)航選擇前進或者后退,應(yīng)用則需保存全部必要數(shù)據(jù)并釋放不必要占用的硬件資源。

第二步 我們的應(yīng)用程序可能處于以下五種狀態(tài),分別為:Created、Started、Resumed、Paused 以及 Stopped。另有七種回調(diào)方法能夠讓應(yīng)用進入或者脫離上述狀態(tài),它們分別是:onCreate、onStart、onRestart、onResume、onPause、onStop 以及 onDestroy。這些方法能夠讓我們的應(yīng)用程序在可能的狀態(tài)之間進行切換,而且某些情況下切換速度會很快。通常來說,大家可以認(rèn)為自己的應(yīng)用程序始終處于 resumed、paused 或者 stopped 這三種狀態(tài)之下,因為其它狀態(tài)都是暫時性的。

當(dāng)我們的應(yīng)用程序正處于運行當(dāng)中且用戶與之進行操作交互,這時的應(yīng)用狀態(tài)為 Resumed;當(dāng)另一個 Activity 處于前臺但僅僅使我們的應(yīng)用被部分隱藏時,這時的應(yīng)用狀態(tài)為 Paused——在這種狀態(tài)下用戶無法再與應(yīng)用進行交互。當(dāng)我們的應(yīng)用完全處于后臺之下,而且用戶既無法操作、也無法觀看到它時,其狀態(tài)即為 Stopped。在這種狀態(tài)下 Activity 會保留之前的所有數(shù)據(jù),但無法加以執(zhí)行。

2.進入 Resumed 狀態(tài) 如我們所知,主 Activity 會在應(yīng)用程序啟動時開始運行,onCreate 方法也將執(zhí)行、從而讓我們準(zhǔn)備該類所需要的 Activity UI 以及全部數(shù)據(jù)條目。我們創(chuàng)建的大部分應(yīng)用當(dāng)中都包含不只一個 Activity,其它 Activity 會在用戶與應(yīng)用程序進行操作交互時啟動。大家可以利用以下代碼通過 Intent 類啟動另一個非主 Activity:

這代表著應(yīng)用程序包中另一個名為“About”的 Activity 類。大家可以通過選擇自己的源碼包而后選擇“文件”、“新建”、“類”的方式在 Eclipse 當(dāng)中創(chuàng)建一個新 Activity,而后將該 Android Activity 類選定為超級類。請記住,每一個 Activity 都必須在我們的應(yīng)用程序清單當(dāng)中列出。大家還可以利用 Intent 類實現(xiàn)不同 Activity 之間的數(shù)據(jù)轉(zhuǎn)移。

當(dāng)一個 Activity 處于運行當(dāng)中時,onCreate 方法也在同時執(zhí)行,因此除了把其它 Activity 類列入清單之外、大家也能夠以與主 Activity 類似的方式在應(yīng)用程序當(dāng)中處理這些類。我們也可以為每個 Activity 創(chuàng)建一個布局文件,并通過設(shè)置讓其使用與主 Activity 同樣的技術(shù)機制。

在某個 Activity 的 onCreate 方法開始執(zhí)行之后,onStart 與 onResume 兩個方法也將開始執(zhí)行, 從而使該 Activity 處于 Resumed 狀態(tài)、并在后續(xù)執(zhí)行過程中根據(jù)情況轉(zhuǎn)換為 Created 以及 Started 狀態(tài)。

我們的 Activity 可以通過不只一種方式進入 Resumed 狀態(tài),應(yīng)用程序啟動只是其中最基本的途徑。如果 Activity 處于 Paused 或者 Stopped 狀態(tài),則應(yīng)用程序切換至當(dāng)前之后該 Activity 將直接進入前臺運行模式,且無需重復(fù)調(diào)用 onCreate 方法。如果大家的應(yīng)用從 Paused 狀態(tài)切換回 Resumed 狀態(tài),則 Activity 的 onResume 方法將開始執(zhí)行。如果該應(yīng)用由 Stopped 狀態(tài)切換回運行狀態(tài),則執(zhí)行 onRestart 方法、而后依次為 onStart 與 onResume 方法。

3.進入 Destroyed 狀態(tài) 第一步 當(dāng)我們的應(yīng)用程序處于退出或者隱藏狀態(tài)下,則 Resumed 就會轉(zhuǎn)變?yōu)?Destroyed。這時候,onPause 方法會將應(yīng)用的 Activity 由運行時的 Resumed 狀態(tài)轉(zhuǎn)換為 Paused 狀態(tài)。在 onPause 當(dāng)中,大家應(yīng)當(dāng)停止任何需要占用資源的任務(wù),例如動畫播放、傳感器數(shù)據(jù)處理以及廣播接收等等。如果 onPause 正在執(zhí)行,那么 onStop 也可以開始執(zhí)行,因為用戶此時通常已經(jīng)通過導(dǎo)航退出了我們的應(yīng)用程序。大家還可以利用 onPause 方法進行數(shù)據(jù)保存——雖然通常來說數(shù)據(jù)保存工作由 onStop 方法來負(fù)責(zé)最為妥當(dāng)。

正如我們之前曾經(jīng)提到,大家的 Activity 能夠通過 onResume 方法從 Paused 狀態(tài)重新回歸至 Resumed 狀態(tài)。這意味著我們可以利用 onResume 來恢復(fù)任何我們之前在 onPause 當(dāng)中停止或者發(fā)布過的內(nèi)容。不過大家還需要記住一點,onResume 在其它情況下也會付諸執(zhí)行,例如在應(yīng)用程序啟動時。

第二步 在 onPause 之后,如果應(yīng)用程序進入 Stopped 狀態(tài),那么 onStop 也將開始執(zhí)行。在這種情況下,onRestart、onStart 以及 onResume 等方法仍然能夠使應(yīng)用程序重新回到 Resumed 狀態(tài)。在 onStop 中,大家應(yīng)當(dāng)盡可能壓縮只在必要數(shù)據(jù)的操作量,例如向數(shù)據(jù)庫中寫入內(nèi)容。請大家確保在 onStop 當(dāng)中囊括了所有應(yīng)用程序所使用的資源,從而避免該應(yīng)用在被徹底關(guān)閉之后導(dǎo)致內(nèi)存溢出問題。

這套系統(tǒng)會在應(yīng)用程序從 resumed 狀態(tài)切換至 stopped 狀態(tài)后保存特定數(shù)據(jù),例如視圖中需要顯示的內(nèi)容。當(dāng)某個 Activity 從 Stopped 狀態(tài)恢復(fù)到 Resumed 狀態(tài)時,onRestart、onStart 以及 onResume 方法都會開始執(zhí)行。不過 onStart 與 onResume 的執(zhí)行情況有所不同——例如在應(yīng)用程序啟動之時。而 onRestart 方法只會在應(yīng)用程序從 Stopped 狀態(tài)恢復(fù)至前臺之后才會執(zhí)行,這樣大家就能利用它來恢復(fù)任何保存在 onStop 當(dāng)中的運行內(nèi)容。

提示:當(dāng)大家從一個 Activit 之下啟動另一個 Activity 時,前者會進入 Stopped 狀態(tài)。如果用戶隨后利用后退按鈕再次由后者返回先前的 Activity 當(dāng),那么前者的 onRestart 方法就會開始執(zhí)行。

第三步 如果大家的應(yīng)用程序即將徹底關(guān)閉,例如我們的當(dāng)前 Activity 被從系統(tǒng)當(dāng)中移除,則 onDestroy 方法會開始執(zhí)行。盡管這是在我們的 Activity 完全消失之前執(zhí)行的最后一個方法,大家仍然不應(yīng)該簡單地將所有內(nèi)容一股腦清除。事實上,我們需要利用 onStop 或者 onPause 來處理結(jié)束工作。當(dāng)然也有例外情況,如果應(yīng)用程序的后臺進程仍然處于運行狀態(tài),那么這時候大家應(yīng)該在 onDestroy 當(dāng)中將其停止。

在 onDestroy 執(zhí)行之后,如果用戶通過導(dǎo)航返回應(yīng)用程序 Activity,則對應(yīng) onCreate 方法將再次被啟動。一般情況下,大家可以假設(shè) onPause 與 onStop 會在 onDestroy 之前執(zhí)行。不過如果大家明確調(diào)用 finish 方法來結(jié)束一個 Activity,則只有 onDestroy 會被執(zhí)行。

在多數(shù)情況下,我們并不需要為應(yīng)用程序當(dāng)中的生命周期回調(diào)問題投入過多精力,因為大家完全可以利用 onCreate 方法的參數(shù)實現(xiàn)數(shù)據(jù)保留效果。在 Activity onCreate 方法當(dāng)中,Bundle 參數(shù)負(fù)責(zé)如前所述自動進行視圖信息保存。不過大家也可以利用該對象保存更多數(shù)據(jù)內(nèi)容,例如記錄用戶與應(yīng)用程序之間的交互所產(chǎn)生的變量更新。要實現(xiàn)這一目標(biāo),大家可以在 Activity 類當(dāng)中使用 onSaveInstanceState 方法,完成數(shù)據(jù)鍵值對的編寫之后、我們就可能在 onCreate 當(dāng)中將其恢復(fù)。

提示:當(dāng)用戶改變設(shè)備顯示模式時,也就是在縱向及橫向模式間進行切換,我們的 Activity 實際上會經(jīng)歷重新創(chuàng)建、onCreate 也會被再次執(zhí)行。這一過程被我們稱為配置變化。在這種情況下,系統(tǒng)會假設(shè)大家需要重新創(chuàng)建 Activity,例如大家在每種顯示模式下使用不同的布局方案。不過在多數(shù)情況下,大家可能不希望系統(tǒng)照此辦理。為了避免我們的 Activity 在顯示模式轉(zhuǎn)換時發(fā)生重新創(chuàng)建,大家可以從兩種解決方式中作出選擇:向清單內(nèi)的 Activity 添加“android:configChanges”屬性,或者調(diào)整我們的 Activity 結(jié)構(gòu)、利用我們在配置變量時所保留的 Fragments。

總結(jié) 當(dāng)大家開始學(xué)習(xí)如何為 Android 平臺開發(fā)應(yīng)用程序時,Activity 當(dāng)中所涉及的大量狀態(tài)與回調(diào)方法可能會成為很多難題乃至混亂的根源。然而在大多數(shù)情況下,我們只需要采用最低數(shù)量的方法以確保自己的應(yīng)用程序有能力提供用戶所預(yù)期的功能與效果。在本系列教程的下一篇當(dāng)中,我們將共同了解部分常用 Android 類,大家很可能會在自己的第一款應(yīng)用當(dāng)中與它們打交道。在此之后,我們將著眼于 Android 代碼示例、需要了解的應(yīng)用程序發(fā)布知識以及其它一些關(guān)于今后進一步學(xué)習(xí)的建議。

原文鏈接:

http://mobile.tutsplus.com/tutorials/android/android-sdk-activities-lifecycle/