国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > activity生命周期詳解,大牛教會(huì)你

activity生命周期詳解,大牛教會(huì)你 時(shí)間:2018-07-12      來(lái)源:未知

 Activity和BroadcastReceiver ,Service ,contentprovider 并稱為Android 四大組件,對(duì)于他們來(lái)說(shuō)構(gòu)成了Android應(yīng)用的骨架,缺一不可,對(duì)于Activity來(lái)說(shuō),更是他們之中的重中之重。

首先學(xué)習(xí)Activity,需要先了解一下他的作用:

在日常應(yīng)用中Activity是與用戶交互的接口,它提供了一個(gè)用戶完成相關(guān)操作的窗口。當(dāng)我們?cè)陂_發(fā)中創(chuàng)建Activity后,通過(guò)調(diào)用setContentView(View)方法來(lái)給該Activity指定一個(gè)布局界面,而這個(gè)界面就是提供給用戶交互的接口。Android系統(tǒng)中是通過(guò)Activity棧的方式來(lái)管理Activity的,而Activity自身則是通過(guò)生命周期的方法來(lái)管理的自己的創(chuàng)建與銷毀,既然如此,現(xiàn)在我們就來(lái)看看Activity生命周期是如何運(yùn)作的。

其次對(duì)于Activity來(lái)說(shuō)是有一個(gè)運(yùn)行狀態(tài)的,就好比當(dāng)我們的頁(yè)面處于屏幕的最前端,處于陰影狀態(tài),處于后臺(tái)中等等又可細(xì)分為好幾種狀態(tài):

Active/Running:

Activity處于活動(dòng)狀態(tài),此時(shí)Activity處于棧頂,是可見狀態(tài),可與用戶進(jìn)行交互。

Paused:

當(dāng)Activity失去焦點(diǎn)時(shí),或被一個(gè)新的非全屏的Activity,或被一個(gè)透明的Activity放置在棧頂時(shí),Activity就轉(zhuǎn)化為Paused狀態(tài)。但我們需要明白,此時(shí)Activity只是失去了與用戶交互的能力,其所有的狀態(tài)信息及其成員變量都還存在,只有在系統(tǒng)內(nèi)存緊張的情況下,才有可能被系統(tǒng)回收掉。

Stopped:

當(dāng)一個(gè)Activity被另一個(gè)Activity完全覆蓋時(shí),被覆蓋的Activity就會(huì)進(jìn)入Stopped狀態(tài),此時(shí)它不再可見,但是跟Paused狀態(tài)一樣保持著其所有狀態(tài)信息及其成員變量。

Killed:

當(dāng)Activity被系統(tǒng)回收掉時(shí),Activity就處于Killed狀態(tài)。

Activity會(huì)在以上四種形態(tài)中相互切換,至于如何切換,這因用戶的操作不同而異。

了解了Activity的4種形態(tài)后,我們就來(lái)聊聊Activity的生命周期。

相信大部分人對(duì)這種流程圖并不陌生,嗯,我們下面主要聊得話題就是圍繞這張流程圖了。我們先有個(gè)大概印象,后面我們分析完后再回來(lái)看,就相當(dāng)清晰了。

所謂的典型的生命周期就是在有用戶參與的情況下,Activity經(jīng)歷從創(chuàng)建,運(yùn)行,停止,銷毀等正常的生命周期過(guò)程。我們這里先來(lái)介紹一下幾個(gè)主要方法的調(diào)用時(shí)機(jī),然后再通過(guò)代碼層面來(lái)驗(yàn)證其調(diào)用流程。

onCreate : 該方法是在Activity被創(chuàng)建時(shí)回調(diào),它是生命周期第一個(gè)調(diào)用的方法,我們?cè)趧?chuàng)建Activity時(shí)一般都需要重寫該方法,然后在該方法中做一些初始化的操作,如通過(guò)setContentView設(shè)置界面布局的資源,初始化所需要的組件信息等。

onStart : 此方法被回調(diào)時(shí)表示Activity正在啟動(dòng),此時(shí)Activity已處于可見狀態(tài),只是還沒有在前臺(tái)顯示,因此無(wú)法與用戶進(jìn)行交互?梢院(jiǎn)單理解為Activity已顯示而我們無(wú)法看見擺了。

onResume : 當(dāng)此方法回調(diào)時(shí),則說(shuō)明Activity已在前臺(tái)可見,可與用戶交互了(處于前面所說(shuō)的Active/Running形態(tài)),onResume方法與onStart的相同點(diǎn)是兩者都表示Activity可見,只不過(guò)onStart回調(diào)時(shí)Activity還是后臺(tái)無(wú)法與用戶交互,而onResume則已顯示在前臺(tái),可與用戶交互。當(dāng)然從流程圖,我們也可以看出當(dāng)Activity停止后(onPause方法和onStop方法被調(diào)用),重新回到前臺(tái)時(shí)也會(huì)調(diào)用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。

onPause : 此方法被回調(diào)時(shí)則表示Activity正在停止(Paused形態(tài)),一般情況下onStop方法會(huì)緊接著被回調(diào)。但通過(guò)流程圖我們還可以看到一種情況是onPause方法執(zhí)行后直接執(zhí)行了onResume方法,這屬于比較極端的現(xiàn)象了,這可能是用戶操作使當(dāng)前Activity退居后臺(tái)后又迅速地再回到到當(dāng)前的Activity,此時(shí)onResume方法就會(huì)被回調(diào)。當(dāng)然,在onPause方法中我們可以做一些數(shù)據(jù)存儲(chǔ)或者動(dòng)畫停止或者資源回收的操作,但是不能太耗時(shí),因?yàn)檫@可能會(huì)影響到新的Activity的顯示——onPause方法執(zhí)行完成后,新Activity的onResume方法才會(huì)被執(zhí)行。

onStop : 一般在onPause方法執(zhí)行完成直接執(zhí)行,表示Activity即將停止或者完全被覆蓋(Stopped形態(tài)),此時(shí)Activity不可見,僅在后臺(tái)運(yùn)行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時(shí))。

onRestart :表示Activity正在重新啟動(dòng),當(dāng)Activity由不可見變?yōu)榭梢姞顟B(tài)時(shí),該方法被回調(diào)。這種情況一般是用戶打開了一個(gè)新的Activity時(shí),當(dāng)前的Activity就會(huì)被暫停(onPause和onStop被執(zhí)行了),接著又回到當(dāng)前Activity頁(yè)面時(shí),onRestart方法就會(huì)被回調(diào)。

onDestroy :此時(shí)Activity正在被銷毀,也是生命周期最后一個(gè)執(zhí)行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

下面我們通過(guò)程序來(lái)驗(yàn)證上面流程中的幾種比較重要的情況,同時(shí)觀察生命周期方法的回調(diào)時(shí)機(jī)。

說(shuō)完生命周期,現(xiàn)在我們?cè)趤?lái)說(shuō)說(shuō)加載模式

Standard:

默認(rèn)模式,可以不用寫配置。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例。因此,在這種模式下,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同Activity疊加。

例如:

若我有一個(gè)Activity名為A1, 上面有一個(gè)按鈕可跳轉(zhuǎn)到A1。那么如果我點(diǎn)擊按鈕,便會(huì)新啟一個(gè)Activity A1疊在剛才的A1之上,再點(diǎn)擊,又會(huì)再新啟一個(gè)在它之上……

點(diǎn)back鍵會(huì)依照棧順序依次退出。

singleTop

可以有多個(gè)實(shí)例,但是不允許多個(gè)相同Activity疊加。即,如果Activity在棧頂?shù)臅r(shí)候,啟動(dòng)相同的Activity,不會(huì)創(chuàng)建新的實(shí)例,而會(huì)調(diào)用其onNewIntent方法。

例如:

若我有兩個(gè)Activity名為B1,B2,兩個(gè)Activity內(nèi)容功能完全相同,都有兩個(gè)按鈕可以跳到B1或者B2,唯一不同的是B1為standard,B2為singleTop。

若我意圖打開的順序?yàn)锽1->B2->B2,則實(shí)際打開的順序?yàn)锽1->B2(后一次意圖打開B2,實(shí)際只調(diào)用了前一個(gè)的onNewIntent方法)

若我意圖打開的順序?yàn)锽1->B2->B1->B2,則實(shí)際打開的順序與意圖的一致,為B1->B2->B1->B2。

singleTask

只有一個(gè)實(shí)例。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候,若Activity不存在,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例,若存在,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法。

如果是在別的應(yīng)用程序中啟動(dòng)它,則會(huì)新建一個(gè)task,并在該task中啟動(dòng)這個(gè)Activity,singleTask允許別的Activity與其在一個(gè)task中共存,也就是說(shuō),如果我在這個(gè)singleTask的實(shí)例中再打開新的Activity,這個(gè)新的Activity還是會(huì)在singleTask的實(shí)例的task中。

例如:

若我的應(yīng)用程序中有三個(gè)Activity,C1,C2,C3,三個(gè)Activity可互相啟動(dòng),其中C2為singleTask模式,那么,無(wú)論我在這個(gè)程序中如何點(diǎn)擊啟動(dòng),如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多個(gè)實(shí)例,但是C2只會(huì)存在一個(gè),并且這三個(gè)Activity都在同一個(gè)task里面。

但是C1->C2->C3->C2->C3->C1-C2,這樣的操作過(guò)程實(shí)際應(yīng)該是如下這樣的,因?yàn)閟ingleTask會(huì)把task中在其之上的其它Activity destory掉。

操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2

實(shí)際:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2

若是別的應(yīng)用程序打開C2,則會(huì)新啟一個(gè)task。

如別的應(yīng)用Other中有一個(gè)activity,taskId為200,從它打開C2,則C2的taskIdI不會(huì)為200,例如C2的taskId為201,那么再?gòu)腃2打開C1、C3,則C2、C3的taskId仍為201。

注意:如果此時(shí)你點(diǎn)擊home,然后再打開Other,發(fā)現(xiàn)這時(shí)顯示的肯定會(huì)是Other應(yīng)用中的內(nèi)容,而不會(huì)是我們應(yīng)用中的C1 C2 C3中的其中一個(gè)。

singleInstance

只有一個(gè)實(shí)例,并且這個(gè)實(shí)例獨(dú)立運(yùn)行在一個(gè)task中,這個(gè)task只有這個(gè)實(shí)例,不允許有別的Activity存在。

例如:

程序有三個(gè)ActivityD1,D2,D3,三個(gè)Activity可互相啟動(dòng),其中D2為singleInstance模式。那么程序從D1開始運(yùn)行,假設(shè)D1的taskId為200,那么從D1啟動(dòng)D2時(shí),D2會(huì)新啟動(dòng)一個(gè)task,即D2與D1不在一個(gè)task中運(yùn)行。假設(shè)D2的taskId為201,再?gòu)腄2啟動(dòng)D3時(shí),D3的taskId為200,也就是說(shuō)它被壓到了D1啟動(dòng)的任務(wù)棧中。

若是在別的應(yīng)用程序打開D2,假設(shè)Other的taskId為200,打開D2,D2會(huì)新建一個(gè)task運(yùn)行,假設(shè)它的taskId為201,那么如果這時(shí)再?gòu)腄2啟動(dòng)D1或者D3,則又會(huì)再創(chuàng)建一個(gè)task,因此,若操作步驟為other->D2->D1,這過(guò)程就涉及到了3個(gè)task了。

上一篇:busybox文件系統(tǒng)制作步驟,帶你快速學(xué)習(xí)

下一篇:fread()函數(shù)語(yǔ)法要點(diǎn)總結(jié),附帶程序?qū)嵗?/a>

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部