国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Activity的生命周期和啟動(dòng)模式詳解

2019-11-06 09:48:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1Activity生命周期全面分析1-1典型情況下正常情況下的生命周期分析1-2異常情況下的生命周期分析1-2-1資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity重建1-2-2內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死2Activity的啟動(dòng)模式2-1Activity的LaunchMode

1Activity生命周期全面分析

1-1典型情況下(正常情況下)的生命周期分析

圖 1-1  Activity生命周期切換過(guò)程圖 (1)onCreate表示Activity 正在被創(chuàng)建,我們可以在這個(gè)方法中做一些初始化工作; (2)onStart表示Activity 正在被啟動(dòng),此時(shí)Activity已經(jīng)顯示出來(lái)了,但是還未出現(xiàn)在前臺(tái),用戶還看不見(jiàn),還不能與它進(jìn)行交互; (3)onResume表示Activity 已經(jīng)出現(xiàn)在前臺(tái),此時(shí)可以與用戶進(jìn)行交互; (4)onPause表示Activity 正在停止,但是此時(shí)還處在可見(jiàn)狀態(tài),此時(shí)可以做一些不太耗時(shí)的工作,如:停止動(dòng)畫(huà),否則會(huì)影響新界面的顯示; (5)onStop表示Activity 即將停止,可以做一些稍微重量級(jí)的回收工作,但是也不能太耗時(shí); (6)onDestory表示Activity 即將被銷毀,可以做一些回收工作和最終的資源釋放; (7)onRestart表示Activity 正在重新啟動(dòng),一般情況下,當(dāng)前Activity從不可見(jiàn)狀態(tài)變?yōu)榭梢?jiàn)狀態(tài)時(shí)被調(diào)用; (8)從Activity是否可見(jiàn)來(lái)說(shuō),onStart和onStop是配對(duì)的,從Activity是否出現(xiàn)在前臺(tái)來(lái)說(shuō),onResume和onPause是配對(duì)的; 注意:圖中從onStop->onCreate這條路徑,可能猛的一看,看的會(huì)有點(diǎn)懵逼,那我們就一起來(lái)分析一下在這中間Activity究竟經(jīng)歷了什么,平時(shí)如果手機(jī)內(nèi)存不夠時(shí),會(huì)自動(dòng)終止后臺(tái)存在的進(jìn)程,因?yàn)橐呀?jīng)執(zhí)行了onStop方法,那么該Activity肯定是處于后臺(tái)的,如果接下來(lái)手機(jī)內(nèi)存不夠前臺(tái)的進(jìn)程使用了,就會(huì)從后臺(tái)進(jìn)程中選擇優(yōu)先級(jí)比較低的進(jìn)程來(lái)進(jìn)行內(nèi)存釋放,一旦內(nèi)存釋放那么該進(jìn)程就會(huì)立即終止,Activity將不會(huì)在執(zhí)行onDestroy方法,如果這時(shí),用戶從快捷啟動(dòng)欄,又重新啟動(dòng)了該應(yīng)用,那么該Activity將會(huì)再次執(zhí)行onCreate方法 從ActivityA啟動(dòng)ActivityB,中間Activity的生命周期執(zhí)行順序: A:onPause->B:onCreate->B:onStart->B:onResume->A:onStop

1-2異常情況下的生命周期分析

1-2-1資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity重建

典型的情況是手機(jī)屏幕的橫豎屏變化,接下來(lái)我們就來(lái)一起來(lái)看一下在手機(jī)橫豎屏切換時(shí),Activity的生命周期執(zhí)行順序: onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume 從打印的日志看來(lái),橫屏和豎屏Android系統(tǒng)會(huì)加載不同的系統(tǒng)資源,導(dǎo)致產(chǎn)生舊Activity的銷毀,以及新Activity的重建,又因?yàn)閮蓚€(gè)Activity之間是存在聯(lián)系的,這種聯(lián)系通過(guò)onSaveInstanceState和onRestoreInstanceState方法建立,onSaveInstanceState用于保存舊Activity當(dāng)前有用的信息,onRestoreInstanceState用于在新Activity中恢復(fù)舊Activity中某些有用的信息; 接下來(lái)看一下,onSaveInstanceState和onRestoreInstanceState方法的執(zhí)行時(shí)機(jī),先來(lái)說(shuō)一下onSaveInstanceState,在下列情況下會(huì)執(zhí)行onSaveInstanceState: 1、當(dāng)用戶按下HOME鍵時(shí)。 這是顯而易見(jiàn)的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則 2、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。 3、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。 4、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。 5、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r。 總而言之,就是存在非人為意愿由系統(tǒng)自動(dòng)銷毀Activity的可能性時(shí)會(huì)執(zhí)行onSaveInstanceState,注意是存在可能性,但是不一定發(fā)生。 接下來(lái)看onRestoreInstanceState方法,該方法是當(dāng)你的Activity確實(shí)被異常終止然后重建Activity時(shí)會(huì)執(zhí)行。 注:onSaveInstanceState執(zhí)行在onStop之前,onRestoreInstanceState執(zhí)行在onStart之后,而且兩者不一定成對(duì)出現(xiàn),只有Activity確實(shí)發(fā)生了銷毀重建時(shí),才會(huì)成對(duì)出現(xiàn),官方建議采用onRestoreInstanceState去恢復(fù)數(shù)據(jù)。 保存和恢復(fù)View層次結(jié)構(gòu)的系統(tǒng)工作流程:Activity被異常終止時(shí),會(huì)調(diào)用onSaveInstanceState去保存數(shù)據(jù),然后Activity會(huì)委托Window去保存數(shù)據(jù),接著Window再委托它上面的頂層容器(一般為DecorView)去保存數(shù)據(jù),最后頂層容器再一一通知它的子元素來(lái)保存數(shù)據(jù),這樣整個(gè)過(guò)程就結(jié)束了。

1-2-2內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死

Activity的優(yōu)先級(jí)分類:   1.前臺(tái)Activity,可以與用戶進(jìn)行交互的Activity的具有最高的優(yōu)先級(jí);   2.可見(jiàn)但非前臺(tái)Activity,無(wú)法直接與用戶進(jìn)行交互,優(yōu)先級(jí)次之;   3.后臺(tái)Activity,執(zhí)行了onStop方法的Activity,優(yōu)先級(jí)最低; 當(dāng)系統(tǒng)內(nèi)存不足時(shí),會(huì)按照優(yōu)先級(jí)去殺死Activity的所在進(jìn)程。

2Activity的啟動(dòng)模式

2-1Activity的LaunchMode

Activity有四種啟動(dòng)模式:standard、singleTop、singleTask、singleInstance (1)standard:標(biāo)準(zhǔn)模式,是系統(tǒng)的默認(rèn)模式,每次啟動(dòng)一個(gè)新的Activity都會(huì)創(chuàng)建一個(gè)新的實(shí)例,不管這個(gè)實(shí)例是否已經(jīng)存在,一個(gè)任務(wù)棧可以有多個(gè)實(shí)例,每個(gè)實(shí)例也可以屬于不同的任務(wù)棧,該模式的Activity會(huì)默認(rèn)進(jìn)入啟動(dòng)它的Activity所屬的任務(wù)棧,所以當(dāng)以applicationContext作為上下文傳入時(shí),會(huì)發(fā)生錯(cuò)誤; (2)singleTop:棧頂復(fù)用模式,在這種模式下,如果新的Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會(huì)被重新創(chuàng)建,同時(shí)它的onNewIntent方法會(huì)被回調(diào),通過(guò)此方法的參數(shù)可以取出當(dāng)前請(qǐng)求的信息。 如果接下來(lái)要啟動(dòng)的Activity位于任務(wù)棧棧頂,接下來(lái)Activity的生命周期執(zhí)行過(guò)程為:onPause->onNewIntent->onResume 如果接下來(lái)要啟動(dòng)的Activity沒(méi)有位于棧頂,接下來(lái)Activity的生命周期執(zhí)行過(guò)程為:onPause->onCreate->onStart->onResume->onSaveInstanceState->onStop (3)singleTask:棧內(nèi)復(fù)用模式,這是一種單實(shí)例模式,在這種模式下,只要Activity在一個(gè)棧中存在,那么多次啟動(dòng)該Activity都不會(huì)重新創(chuàng)建實(shí)例,它的onNewIntent方法也會(huì)被回調(diào),執(zhí)行過(guò)程為:   先查找是否存在該活動(dòng)想要的任務(wù)棧,     如果沒(méi)有,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建該活動(dòng)的實(shí)例把該活動(dòng)放入棧中,     如果存在這樣的任務(wù)棧,則查看該任務(wù)棧內(nèi)是否存在該Activity的實(shí)例,            如果存在該實(shí)例,就把該活動(dòng)調(diào)到棧頂,將該活動(dòng)上的其他活動(dòng)都出棧,       如果不存在該實(shí)例,創(chuàng)建一個(gè)該活動(dòng)的實(shí)例,將其放入該任務(wù)棧 (4)singleInstance:?jiǎn)螌?shí)例模式,這是一種加強(qiáng)的singleTask模式,具有該模式的Activity只能單獨(dú)的位于一個(gè)任務(wù)棧中。 給Activity指定啟動(dòng)模式的方式:   一、通過(guò)AndroidManifest為Activity指定launchMode屬性,例如:   <activity     android:name=".TestRecycleActivity"     android:launchMode="singleTop"    />   二、通過(guò)給Intent添加標(biāo)志位來(lái)實(shí)現(xiàn),例如:   Intent i = new Intent();   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 兩種方式的區(qū)別:第二種方式的優(yōu)先級(jí)高于第一種方式,第一種方式無(wú)法直接為Activity指定FLAG_ACTIVITY_CLEAR_TOP標(biāo)識(shí),第二種方式無(wú)法為Activity指定singleInstance模式。   Activity常用的Flags:     一、FLAG_ACTIVITY_NEW_TASK,作用是為Activity指定“singleTask”啟動(dòng)模式;     二、FLAG_ACTIVITY_SINGLE_TOP,作用是為Activity指定“singleTop”啟動(dòng)模式;     三、FLAG_ACTIVITY_CLEAR_TOP,當(dāng)它啟動(dòng)時(shí),同一個(gè)任務(wù)棧上所有位于它上面的Activity都要出棧;     四、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,作用是具有該標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity列表中,等同于在xml中指定android:excludeFromRecents = “true”; 2-2IntentFilter的匹配規(guī)則 IntentFilter中的過(guò)濾信息有action、category、data,為了匹配過(guò)濾列表,需要同時(shí)匹配過(guò)濾列表中的action、category、data信息,否則匹配失敗,一個(gè)過(guò)濾列表的action、category和data可以有多個(gè),一個(gè)Activity中可以有多個(gè)intent-filter,一個(gè)Intent只要能匹配任何一組intent-filter即可成功啟動(dòng)對(duì)應(yīng)的Activity。 (1)action的匹配規(guī)則 只要Intent中的action能夠和過(guò)濾規(guī)則中的任何一個(gè)action相同即可匹配成功,action區(qū)分大小寫(xiě) (2)category的匹配規(guī)則 如果Intent含有category,那么每個(gè)category必須要在Activity在XML文件中聲明的category中可以找得到; 如果Intent不含有category,并且XML文件中必須聲明

<category android:name="android.intent.category.DEFAULT"/>

也可以成功匹配,因?yàn)樵谑褂胹tartActivity或者startActivityForResult時(shí),會(huì)自動(dòng)為該Intent添加一個(gè)android.intent.category.DEFAULT這個(gè)category,如果未在XML文件中聲明

<category android:name="android.intent.category.DEFAULT"/>

如果不給Intent指定category,會(huì)crash掉; (3)data的匹配規(guī)則 data的結(jié)構(gòu)組成:mimeType和URI,mimeType指媒體類型,比如:image/jpeg、audio/mpeg4-generic和video/*等 URI的結(jié)構(gòu):

<scheme>://<host>:<port>/[<path>|<pathPRefix>|<pathPattern>]

Scheme:URI的模式,比如:http、file、content等,如果URI沒(méi)有指定Scheme,那么整個(gè)URI的其他參數(shù)是無(wú)效的; Host:URI的主機(jī)名,例如:www.baidu.com,如果host未指定,那么其他參數(shù)無(wú)效; Port:URI的端口號(hào); Path:表示完整路徑信息; PathPattern:也表示完整的路徑信息,但是可以包含通配符”*”,*表示0個(gè)或多個(gè)任意字符; pathPrefix:表示路徑的前綴信息; data的匹配規(guī)則和action規(guī)則類似,要求intent必須要含有data數(shù)據(jù),并且data數(shù)據(jù)能夠完全匹配過(guò)濾規(guī)則中的某一個(gè)data。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 古蔺县| 镇坪县| 裕民县| 湾仔区| 西乌珠穆沁旗| 卫辉市| 托克逊县| 阳西县| 扎鲁特旗| 理塘县| 读书| 宕昌县| 云龙县| 绥江县| 南澳县| 淮安市| 闻喜县| 甘孜县| 安徽省| 桐柏县| 英吉沙县| 凤台县| 米易县| 阿合奇县| 黄石市| 大埔区| 沽源县| 南靖县| 城固县| 长白| 扎兰屯市| 瑞安市| 黑水县| 祁阳县| 衡山县| 肃宁县| 佳木斯市| 金堂县| 家居| 常熟市| 兴国县|