您好,登錄后才能下訂單哦!
Activity與生命周期的示例分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
Activity生命周期并不僅僅在用戶運(yùn)行應(yīng)用程序之后才開(kāi)始生效,事實(shí)上它也影響著用戶切出以及切回應(yīng)用時(shí)得到的不同反饋。當(dāng)我們開(kāi)發(fā)一款應(yīng)用時(shí),首先需要牢記一點(diǎn):用戶會(huì)經(jīng)常在執(zhí)行過(guò)程中、在我們的應(yīng)用與其它應(yīng)用之間頻繁切換。取決于用戶的操作方式,同一款應(yīng)用程序有時(shí)在前臺(tái)運(yùn)行、有時(shí)則在后臺(tái)運(yùn)行。大家必須保證自己的應(yīng)用能夠就會(huì)這類(lèi)情況,并在此類(lèi)切換過(guò)程中及時(shí)保存并恢復(fù)數(shù)據(jù)。再次提醒各位,這一過(guò)程對(duì)于某些特定應(yīng)用程序略有不同;例如功能性組件。
為了控制Activity處于不同狀態(tài)下時(shí)應(yīng)用程序的運(yùn)行方式,例如當(dāng)用戶切出或者切回應(yīng)用,大家可以選擇多種處理方法。這類(lèi)方法也就是Activity生命周期回調(diào)方法。Android系統(tǒng)會(huì)在我們的Activity進(jìn)入某種特定狀態(tài)后調(diào)用這些方法,從而通過(guò)一系列步驟確保我們的應(yīng)用程序能夠繼續(xù)起效、不至于丟失數(shù)據(jù)而且在用戶不與之交互時(shí)不會(huì)使用非必要性資源。每一種回調(diào)方法都會(huì)讓我們的應(yīng)用進(jìn)入一種可能的狀態(tài)。
如果大家之前曾經(jīng)接觸過(guò)Java應(yīng)用程序的編程工作,那么應(yīng)該已經(jīng)發(fā)現(xiàn)Android應(yīng)用程序的啟動(dòng)遵循另一種方式。與Java應(yīng)用直接使用主方法不同,Android在啟動(dòng)后會(huì)首先執(zhí)行主Activity類(lèi)中的onCreate方法。請(qǐng)記住,我們已經(jīng)在清單中將該類(lèi)指定為主啟動(dòng)Activity。Activity會(huì)首先回調(diào)onCreate方法,相當(dāng)于重復(fù)用戶啟動(dòng)應(yīng)用程序后的流程。這時(shí)候onCreate方法會(huì)使應(yīng)用程序進(jìn)入Created狀態(tài)。
開(kāi)發(fā)者指南當(dāng)中通過(guò)示意圖以直觀方式介紹了生命周期、回調(diào)方法以及狀態(tài)的概念。其中onResume方法負(fù)責(zé)提供Resumed狀態(tài),這時(shí)我們的應(yīng)用程序可以接受用戶的直接操作。其它各類(lèi)回調(diào)方法都以onResume為核心,即將應(yīng)用程序引導(dǎo)至Resumed狀態(tài)或者從該狀態(tài)脫離、啟動(dòng)該狀態(tài)或者將其停止。
對(duì)于大部分應(yīng)用程序來(lái)說(shuō),我們只需要使用一部分回調(diào)方法,但最起碼要用到onCreate。雖然使用頻率不高,但了解全部回調(diào)及狀態(tài)的作用將幫助我們了解自己的應(yīng)用程序在運(yùn)行及停止運(yùn)行時(shí),Android系統(tǒng)會(huì)受到怎樣的影響。一般情況下,大家需要保證用戶能夠在任何操作過(guò)程切換出去之后、都能順利恢復(fù)到之前的運(yùn)行狀態(tài);如果他們通過(guò)導(dǎo)航選擇前進(jìn)或者后退,應(yīng)用則需保存全部必要數(shù)據(jù)并釋放不必要占用的硬件資源。
我們的應(yīng)用程序可能處于以下五種狀態(tài),分別為:Created、Started、Resumed、Paused以及Stopped。另有七種回調(diào)方法能夠讓?xiě)?yīng)用進(jìn)入或者脫離上述狀態(tài),它們分別是:onCreate、onStart、onRestart、onResume、onPause、onStop以及onDestroy。這些方法能夠讓我們的應(yīng)用程序在可能的狀態(tài)之間進(jìn)行切換,而且某些情況下切換速度會(huì)很快。通常來(lái)說(shuō),大家可以認(rèn)為自己的應(yīng)用程序始終處于resumed、paused或者stopped這三種狀態(tài)之下,因?yàn)槠渌鼱顟B(tài)都是暫時(shí)性的。
當(dāng)我們的應(yīng)用程序正處于運(yùn)行當(dāng)中且用戶與之進(jìn)行操作交互,這時(shí)的應(yīng)用狀態(tài)為Resumed;當(dāng)另一個(gè)Activity處于前臺(tái)但僅僅使我們的應(yīng)用被部分隱藏時(shí),這時(shí)的應(yīng)用狀態(tài)為Paused——在這種狀態(tài)下用戶無(wú)法再與應(yīng)用進(jìn)行交互。當(dāng)我們的應(yīng)用完全處于后臺(tái)之下,而且用戶既無(wú)法操作、也無(wú)法觀看到它時(shí),其狀態(tài)即為Stopped。在這種狀態(tài)下Activity會(huì)保留之前的所有數(shù)據(jù),但無(wú)法加以執(zhí)行。
如我們所知,主Activity會(huì)在應(yīng)用程序啟動(dòng)時(shí)開(kāi)始運(yùn)行,onCreate方法也將執(zhí)行、從而讓我們準(zhǔn)備該類(lèi)所需要的Activity UI以及全部數(shù)據(jù)條目。我們創(chuàng)建的大部分應(yīng)用當(dāng)中都包含不只一個(gè)Activity,其它Activity會(huì)在用戶與應(yīng)用程序進(jìn)行操作交互時(shí)啟動(dòng)。大家可以利用以下代碼通過(guò)Intent類(lèi)啟動(dòng)另一個(gè)非主Activity:
這代表著應(yīng)用程序包中另一個(gè)名為“About”的Activity類(lèi)。大家可以通過(guò)選擇自己的源碼包而后選擇“文件”、“新建”、“類(lèi)”的方式在Eclipse當(dāng)中創(chuàng)建一個(gè)新Activity,而后將該Android Activity類(lèi)選定為超級(jí)類(lèi)。請(qǐng)記住,每一個(gè)Activity都必須在我們的應(yīng)用程序清單當(dāng)中列出。大家還可以利用Intent類(lèi)實(shí)現(xiàn)不同Activity之間的數(shù)據(jù)轉(zhuǎn)移。
當(dāng)一個(gè)Activity處于運(yùn)行當(dāng)中時(shí),onCreate方法也在同時(shí)執(zhí)行,因此除了把其它Activity類(lèi)列入清單之外、大家也能夠以與主Activity類(lèi)似的方式在應(yīng)用程序當(dāng)中處理這些類(lèi)。我們也可以為每個(gè)Activity創(chuàng)建一個(gè)布局文件,并通過(guò)設(shè)置讓其使用與主Activity同樣的技術(shù)機(jī)制。
在某個(gè)Activity的onCreate方法開(kāi)始執(zhí)行之后,onStart與onResume兩個(gè)方法也將開(kāi)始執(zhí)行, 從而使該Activity處于Resumed狀態(tài)、并在后續(xù)執(zhí)行過(guò)程中根據(jù)情況轉(zhuǎn)換為Created以及Started狀態(tài)。
我們的Activity可以通過(guò)不只一種方式進(jìn)入Resumed狀態(tài),應(yīng)用程序啟動(dòng)只是其中最基本的途徑。如果Activity處于Paused或者Stopped狀態(tài),則應(yīng)用程序切換至當(dāng)前之后該Activity將直接進(jìn)入前臺(tái)運(yùn)行模式,且無(wú)需重復(fù)調(diào)用onCreate方法。如果大家的應(yīng)用從Paused狀態(tài)切換回Resumed狀態(tài),則Activity的onResume方法將開(kāi)始執(zhí)行。如果該應(yīng)用由Stopped狀態(tài)切換回運(yùn)行狀態(tài),則執(zhí)行onRestart方法、而后依次為onStart與onResume方法。
當(dāng)我們的應(yīng)用程序處于退出或者隱藏狀態(tài)下,則Resumed就會(huì)轉(zhuǎn)變?yōu)镈estroyed。這時(shí)候,onPause方法會(huì)將應(yīng)用的Activity由運(yùn)行時(shí)的Resumed狀態(tài)轉(zhuǎn)換為Paused狀態(tài)。在onPause當(dāng)中,大家應(yīng)當(dāng)停止任何需要占用資源的任務(wù),例如動(dòng)畫(huà)播放、傳感器數(shù)據(jù)處理以及廣播接收等等。如果onPause正在執(zhí)行,那么onStop也可以開(kāi)始執(zhí)行,因?yàn)橛脩舸藭r(shí)通常已經(jīng)通過(guò)導(dǎo)航退出了我們的應(yīng)用程序。大家還可以利用onPause方法進(jìn)行數(shù)據(jù)保存——雖然通常來(lái)說(shuō)數(shù)據(jù)保存工作由onStop方法來(lái)負(fù)責(zé)最為妥當(dāng)。
正如我們之前曾經(jīng)提到,大家的Activity能夠通過(guò)onResume方法從Paused狀態(tài)重新回歸至Resumed狀態(tài)。這意味著我們可以利用onResume來(lái)恢復(fù)任何我們之前在onPause當(dāng)中停止或者發(fā)布過(guò)的內(nèi)容。不過(guò)大家還需要記住一點(diǎn),onResume在其它情況下也會(huì)付諸執(zhí)行,例如在應(yīng)用程序啟動(dòng)時(shí)。
在onPause之后,如果應(yīng)用程序進(jìn)入Stopped狀態(tài),那么onStop也將開(kāi)始執(zhí)行。在這種情況下,onRestart、onStart以及onResume等方法仍然能夠使應(yīng)用程序重新回到Resumed狀態(tài)。在onStop中,大家應(yīng)當(dāng)盡可能壓縮只在必要數(shù)據(jù)的操作量,例如向數(shù)據(jù)庫(kù)中寫(xiě)入內(nèi)容。請(qǐng)大家確保在onStop當(dāng)中囊括了所有應(yīng)用程序所使用的資源,從而避免該應(yīng)用在被徹底關(guān)閉之后導(dǎo)致內(nèi)存溢出問(wèn)題。
這套系統(tǒng)會(huì)在應(yīng)用程序從resumed狀態(tài)切換至stopped狀態(tài)后保存特定數(shù)據(jù),例如視圖中需要顯示的內(nèi)容。當(dāng)某個(gè)Activity從Stopped狀態(tài)恢復(fù)到Resumed狀態(tài)時(shí),onRestart、onStart以及onResume方法都會(huì)開(kāi)始執(zhí)行。不過(guò)onStart與onResume的執(zhí)行情況有所不同——例如在應(yīng)用程序啟動(dòng)之時(shí)。而onRestart方法只會(huì)在應(yīng)用程序從Stopped狀態(tài)恢復(fù)至前臺(tái)之后才會(huì)執(zhí)行,這樣大家就能利用它來(lái)恢復(fù)任何保存在onStop當(dāng)中的運(yùn)行內(nèi)容。
提示:當(dāng)大家從一個(gè)Activit之下啟動(dòng)另一個(gè)Activity時(shí),前者會(huì)進(jìn)入Stopped狀態(tài)。如果用戶隨后利用后退按鈕再次由后者返回先前的Activity當(dāng),那么前者的onRestart方法就會(huì)開(kāi)始執(zhí)行。
如果大家的應(yīng)用程序即將徹底關(guān)閉,例如我們的當(dāng)前Activity被從系統(tǒng)當(dāng)中移除,則onDestroy方法會(huì)開(kāi)始執(zhí)行。盡管這是在我們的Activity完全消失之前執(zhí)行的一個(gè)方法,大家仍然不應(yīng)該簡(jiǎn)單地將所有內(nèi)容一股腦清除。事實(shí)上,我們需要利用onStop或者onPause來(lái)處理結(jié)束工作。當(dāng)然也有例外情況,如果應(yīng)用程序的后臺(tái)進(jìn)程仍然處于運(yùn)行狀態(tài),那么這時(shí)候大家應(yīng)該在onDestroy當(dāng)中將其停止。
在onDestroy執(zhí)行之后,如果用戶通過(guò)導(dǎo)航返回應(yīng)用程序Activity,則對(duì)應(yīng)onCreate方法將再次被啟動(dòng)。一般情況下,大家可以假設(shè)onPause與onStop會(huì)在onDestroy之前執(zhí)行。不過(guò)如果大家明確調(diào)用finish方法來(lái)結(jié)束一個(gè)Activity,則只有onDestroy會(huì)被執(zhí)行。
在多數(shù)情況下,我們并不需要為應(yīng)用程序當(dāng)中的生命周期回調(diào)問(wèn)題投入過(guò)多精力,因?yàn)榇蠹彝耆梢岳胦nCreate方法的參數(shù)實(shí)現(xiàn)數(shù)據(jù)保留效果。在Activity onCreate方法當(dāng)中,Bundle參數(shù)負(fù)責(zé)如前所述自動(dòng)進(jìn)行視圖信息保存。不過(guò)大家也可以利用該對(duì)象保存更多數(shù)據(jù)內(nèi)容,例如記錄用戶與應(yīng)用程序之間的交互所產(chǎn)生的變量更新。要實(shí)現(xiàn)這一目標(biāo),大家可以在Activity類(lèi)當(dāng)中使用onSaveInstanceState方法,完成數(shù)據(jù)鍵值對(duì)的編寫(xiě)之后、我們就可能在onCreate當(dāng)中將其恢復(fù)。
提示:當(dāng)用戶改變?cè)O(shè)備顯示模式時(shí),也就是在縱向及橫向模式間進(jìn)行切換,我們的Activity實(shí)際上會(huì)經(jīng)歷重新創(chuàng)建、onCreate也會(huì)被再次執(zhí)行。這一過(guò)程被我們稱(chēng)為配置變化。在這種情況下,系統(tǒng)會(huì)假設(shè)大家需要重新創(chuàng)建Activity,例如大家在每種顯示模式下使用不同的布局方案。不過(guò)在多數(shù)情況下,大家可能不希望系統(tǒng)照此辦理。為了避免我們的Activity在顯示模式轉(zhuǎn)換時(shí)發(fā)生重新創(chuàng)建,大家可以從兩種解決方式中作出選擇:向清單內(nèi)的Activity添加“android:configChanges”屬性,或者調(diào)整我們的Activity結(jié)構(gòu)、利用我們?cè)谂渲米兞繒r(shí)所保留的Fragments。
關(guān)于Activity與生命周期的示例分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。