一毯盈、基礎(chǔ)
1.1自己創(chuàng)建的activity必須要繼承類Activity(或其子類)剃毒。在activity里,為了實(shí)現(xiàn)activity各種狀態(tài)的切換奶镶,你必須實(shí)現(xiàn)指定的回調(diào)方法迟赃。以下是最為重要的兩個(gè)回調(diào)方法
onCreate():
這是必須實(shí)現(xiàn)的回調(diào)方法,啟動(dòng)一個(gè) activity時(shí)會(huì)首先調(diào)用此方法厂镇。因此,在onCreate()的方法體里左刽,你應(yīng)該初始化該activity必要的控件捺信。值得注意的是,在這里你必須調(diào)用setContentView(View view)方法去呈現(xiàn)用戶的界面。
onPause():
在用戶將要離開activity時(shí)調(diào)用此方法(指的是此時(shí)activity處于半透明狀態(tài)且沒有獲取用戶的焦點(diǎn))迄靠。通常在這樣的狀態(tài)下秒咨,你需要處理用戶數(shù)據(jù)的提交、動(dòng)畫處理等操作掌挚。
1.2銷毀activity
你可以調(diào)用finish()方法去銷毀一個(gè)activity雨席。同樣得,你可以調(diào)用finishActivity()方法去銷毀一個(gè)你剛剛啟動(dòng)的activity吠式。
tips:
在多數(shù)情況下陡厘,你是不需要顯式地調(diào)用finish…()方法去銷毀一個(gè)activity。在將要討論到的activity生命周期里特占,你可以知道糙置,Android系統(tǒng)會(huì)為你管理activity的生命周期,所以你并不需要顯式銷毀activity(即調(diào)用finish類方法)是目。顯式地調(diào)用finish類方法谤饭,會(huì)對用戶的體驗(yàn)產(chǎn)生不利的影響,除非你確實(shí)是不希望用戶返回到此activity(界面)懊纳,才去顯式調(diào)用finish類方法揉抵。
二、認(rèn)識(shí)activity的生命周期
2嗤疯、1
Activity的生命周期對它的任務(wù)功舀、backstack和與此有關(guān)聯(lián)的activity有著直接的影響。因此想開發(fā)出一個(gè)健壯的有彈性的Android程序身弊,你需要學(xué)會(huì)如何去管理activity的生命周期(即調(diào)用各種回調(diào)方法)辟汰。
activity的生命周期主要包含一些三種狀態(tài):
(1)運(yùn)行態(tài)(Resumedstate)
此時(shí)Activity程序顯示在屏幕前臺(tái),并且具有焦點(diǎn)阱佛,可以與用戶的操作進(jìn)行交互帖汞,如向用戶提供信息、捕獲用戶單擊按鈕的事件并做處理凑术。
(2)暫停態(tài)(PausedState)
此時(shí)Activity程序失去了焦點(diǎn)翩蘸,并被其他處于運(yùn)行態(tài)的otherActivity取代在屏幕顯示,但otherActivity程序并沒有覆蓋整個(gè)屏幕或者具有半透明的效果—此狀態(tài)即為暫停態(tài)淮逊。處于暫停態(tài)的Activity仍然對用戶可見催首,并且是完全存活的(此時(shí)Activity對象存留在內(nèi)存里,保留著所有狀態(tài)與成員信息并保持與窗口管理器的連接)泄鹏。如果系統(tǒng)處于內(nèi)存不足的情況下郎任,會(huì)殺死這個(gè)Activity。
(3)停止態(tài)(StoppedState)
當(dāng)Activity完全被另一個(gè)otherActivity覆蓋時(shí)(此時(shí)otherActivity顯示在屏幕前臺(tái))备籽,則處于停止態(tài)舶治。處于停滯態(tài)的Activity依然是存活的(此時(shí)Activity對象依然存留在內(nèi)存里,保留著所有的狀態(tài)和與成員信息,但沒有與窗口管理器保持連接)霉猛,而且它對用戶是不可見的尺锚,如果其他地方需要內(nèi)存,系統(tǒng)會(huì)銷毀這個(gè)Activity惜浅。
處于暫停態(tài)(PausedState)或者停止態(tài)(Stopped
State)的Activity瘫辩,系統(tǒng)可以通過調(diào)用finish()方法或者直接終止它的進(jìn)程來銷毀此Activity(從內(nèi)存中清楚此Activity對象)。被finish()或者銷毀的Activity再重新打開時(shí)坛悉,是需要再次初始化此Activity的伐厌。
2、2
當(dāng)一個(gè)Activity從一種狀態(tài)轉(zhuǎn)到另一種狀態(tài)時(shí)吹散,會(huì)通過調(diào)用回調(diào)方法來通知這種變化弧械。這些回調(diào)方法都是可以重寫的,你可以根據(jù)程序的的需要來選擇重寫對應(yīng)的回調(diào)方法空民。以下列出了Activity生命周期里的基本回調(diào)方法:
第三步:運(yùn)行上述工程,效果圖如下(沒什么特別的):
打開應(yīng)用時(shí)先后執(zhí)行了onCreate()->onStart()->onResume三個(gè)方法刃唐,看一下LogCat視窗如下:
BACK鍵:當(dāng)我們按BACK鍵時(shí),我們這個(gè)應(yīng)用程序?qū)⒔Y(jié)束界轩,這時(shí)候我們將先后調(diào)用onPause()->onStop()->onDestory()三個(gè)方法画饥,如下圖所示:
HOME鍵:當(dāng)我們打開應(yīng)用程序時(shí),比如瀏覽器浊猾,我正在瀏覽NBA新聞抖甘,看到一半時(shí),我突然想聽歌葫慎,這時(shí)候我們會(huì)選擇按HOME鍵衔彻,然后去打開音樂應(yīng)用程序,而當(dāng)我們按HOME的時(shí)候偷办,Activity先后執(zhí)行了onPause()->onStop()這兩個(gè)方法艰额,這時(shí)候應(yīng)用程序并沒有銷毀。如下圖所示:
而當(dāng)我們再次啟動(dòng)ActivityDemo應(yīng)用程序時(shí)椒涯,則先后分別執(zhí)行了onRestart()->onStart()->onResume()三個(gè)方法柄沮,如下圖所示:
筆記:在方法體里,必須先調(diào)用父類對應(yīng)的實(shí)現(xiàn)方法super.Xxx()废岂,再執(zhí)行其他的操作(如上面代碼所示)祖搓。為了習(xí)慣,下面也提供一些代碼來測試一些這些方法的使用湖苞,在博客的最后面拯欧。
總的來說,這些回調(diào)方法定義了Activity整個(gè)生命周期袒啼。在生命周期里通過重寫這些回調(diào)方法哈扮,纬纪,你可以監(jiān)控以下下三個(gè)嵌套的方法循環(huán)蚓再。
完整存活的時(shí)間:
Activity的完整存活的時(shí)間是自第一次調(diào)用onCreate()開始滑肉,直至調(diào)用onDestroy()為止。Activity在onCreate()中設(shè)置所有“全局”狀態(tài)以完成初始化摘仅,而在onDestroy()中釋放所有系統(tǒng)資源靶庙。例如,如果Activity有一個(gè)線程在后臺(tái)運(yùn)行從網(wǎng)絡(luò)下載數(shù)據(jù)娃属,它會(huì)在onCreate()創(chuàng)建線程六荒,而在 onDestroy()銷毀線程。
可見狀態(tài)的時(shí)間:
Activity的可見狀態(tài)是自onStart()調(diào)用開始直到相應(yīng)的onStop()調(diào)用結(jié)束矾端。在此期間掏击,用戶可以在屏幕上看到Activity,盡管它也許并不是位于前臺(tái)或者也不與用戶進(jìn)行交互秩铆。在這兩個(gè)方法之間砚亭,我們可以保留用來向用戶顯示這個(gè)Activity所需的資源。
例如殴玛,當(dāng)用戶不再看見我們顯示的內(nèi)容時(shí)捅膘,我們可以在onStart()中注冊一個(gè)BroadcastReceiver來監(jiān)控會(huì)影響UI的變化,而在onStop()中來注消滚粟。onStart() 和 onStop() 方法可以隨著應(yīng)用程序是否為用戶可見而被多次調(diào)用寻仗。
顯示在前臺(tái)的時(shí)間:
Activity的前臺(tái)顯示是自onResume()調(diào)用起,至相應(yīng)的onPause()調(diào)用為止凡壤。在此期間署尤,Activity位于前臺(tái)最上面并與用戶進(jìn)行交互。Activity會(huì)經(jīng)常在暫停和恢復(fù)之間進(jìn)行狀態(tài)轉(zhuǎn)換——例如當(dāng)設(shè)備轉(zhuǎn)入休眠狀態(tài)或者有新的Activity啟動(dòng)時(shí)亚侠,將調(diào)用onPause() 方法曹体。當(dāng)Activity獲得結(jié)果或者接收到新的Intent時(shí)會(huì)調(diào)用onResume() 方法。