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

一迂卢、什么是Activity?

Activity是Android組件中最基本也是最為常見(jiàn)用的四大組件之一?奕谭。

Activity中所有操作都與用戶密切相關(guān)遗菠,是一個(gè)負(fù)責(zé)與用戶交互的組件,可以通過(guò)setContentView(View)來(lái)顯示指定控件烘豌。

在一個(gè)android應(yīng)用中载庭,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽(tīng)并處理用戶的事件做出響應(yīng)廊佩。

二囚聚、 Activity的生命周期

2.1 典型情況下的生命周期:

onCreate:表示Activity正被創(chuàng)建”瓿可以做一些初始化的工作靡挥,比如調(diào)用setContentView加載界面布局、初始化數(shù)據(jù)鸯绿。

onRestart:表示Activity正在重新啟動(dòng)跋破。當(dāng)前Activity從不可見(jiàn)重新變?yōu)榭梢?jiàn)狀態(tài),就會(huì)調(diào)用onRestart瓶蝴。場(chǎng)景:用戶按Home鍵切換到桌面或用戶打開(kāi)一個(gè)新的界面毒返,然后重新回到這個(gè)頁(yè)面。

onStart:表示Activity正在被啟動(dòng)舷手,即將開(kāi)始拧簸。可見(jiàn),但未展示在前臺(tái)男窟,無(wú)法與用戶交互盆赤。

onResume:表示Activity獲得焦點(diǎn)。可見(jiàn)歉眷,并且出現(xiàn)在前臺(tái)牺六,可交互

onPause:正在停止汗捡。此時(shí)Activity在前臺(tái)并可見(jiàn)淑际,可做存儲(chǔ)數(shù)據(jù)、停止動(dòng)畫(huà)等工作,切勿執(zhí)行太耗時(shí)的操作春缕。

onStop:即將停止盗胀。不可見(jiàn),可做稍微重量級(jí)的回收工作锄贼,同樣不能太耗時(shí)票灰。

onDestroy:即將被銷(xiāo)毀。做回收工作和最終的資源釋放宅荤。

onCreate屑迂、onDestroy 一對(duì)? 只調(diào)用一次。

onStart膘侮、onStop一對(duì)? 是否可見(jiàn)屈糊。

onResume的榛、onPause一對(duì)? 是否在前臺(tái)琼了。

2.1.1 Activity生命周期的切換過(guò)程:

Activity第一次啟動(dòng):onCreate->onStart->onResume

當(dāng)用戶打開(kāi)新的Activity或者切換到桌面的時(shí)候:onPause->onStop

當(dāng)用戶返回原Activity:onRestart->onStart->onResume

按back鍵回退:onPause->onStop->onDestroy

在當(dāng)前Activity上打開(kāi)新的Activity:舊onPause->新OnCreate->onStart->onResume->舊onStop

?Activity生命周期的切換過(guò)程

2.2 異常情況下的生命周期

情況一:資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建(比如屏幕旋轉(zhuǎn)導(dǎo)致的系統(tǒng)配置發(fā)生改變)

Activity被意外終止時(shí),才會(huì)調(diào)用onSaveInstanceState和onRestoreInstanceState去保存數(shù)據(jù)和恢復(fù)數(shù)據(jù)夫晌,其他情況不會(huì)觸發(fā)這個(gè)過(guò)程雕薪。

系統(tǒng)配置發(fā)生改變但不希望重新創(chuàng)建Activity,可以給Activity指定configChanges屬性晓淀。比如不想讓Activity在屏幕旋轉(zhuǎn)時(shí)重新創(chuàng)建所袁,可以在manifest中給當(dāng)前的Activity設(shè)置android:configChanges="orientation",不會(huì)調(diào)用onSaveInstanceState和onRestoreInstanceState去保存數(shù)據(jù)和恢復(fù)數(shù)據(jù)凶掰,取而代之的是調(diào)用onConfigurationChanged燥爷。

configChanges? 常用參數(shù):

情況二:資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死

Activity優(yōu)先級(jí):

由高到低:前臺(tái)Activity > 可見(jiàn)但非前臺(tái)Activity(比如:Activity中彈出一個(gè)對(duì)話框,此時(shí)的Activity可見(jiàn)但無(wú)法與用戶交互)> 后臺(tái)Activity(執(zhí)行了onStop的Activity)

當(dāng)內(nèi)存不足時(shí)懦窘,系統(tǒng)會(huì)按照優(yōu)先級(jí)去殺死目標(biāo)Activity所在的進(jìn)程前翎,并在后續(xù)通過(guò)onSaveInstanceState和onRestoreInstanceState來(lái)存儲(chǔ)和恢復(fù)數(shù)據(jù)。如果一個(gè)進(jìn)程中沒(méi)有四大組件在執(zhí)行畅涂,那么將很快被系統(tǒng)殺死港华。

三、Activity的啟動(dòng)模式

3.1 四種啟動(dòng)模式(LaunchMode)

standard:標(biāo)準(zhǔn)模式午衰,系統(tǒng)的默認(rèn)模式立宜。

每次啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例,不管這個(gè)實(shí)例是否已經(jīng)存在臊岸。被創(chuàng)建的實(shí)例符合典型的Activity生命周期橙数。一個(gè)任務(wù)棧中可以有多個(gè)實(shí)例,每個(gè)實(shí)例也可以屬于不同的任務(wù)棧帅戒。在這種模式下商模,誰(shuí)啟動(dòng)了這個(gè)Activity,那么這個(gè)Activity就運(yùn)行在啟動(dòng)它的那個(gè)Activity所在的棧中。

標(biāo)準(zhǔn)模式下的Activity啟動(dòng)示意圖

singleTop:棧頂復(fù)用模式

在這種模式下施流,如果新Activity已經(jīng)位于任務(wù)棧的棧頂响疚,那么此Activity不會(huì)被重新創(chuàng)建,同時(shí)它的onNewIntent方法會(huì)被回調(diào)瞪醋,通過(guò)此方法的參數(shù)我們可以取出當(dāng)前請(qǐng)求的信息忿晕。如果新Activity的實(shí)例已經(jīng)存在但不是位于棧頂,那么新的Activity仍然會(huì)重建银受。

舉三個(gè)栗子來(lái)理解Activity的棧頂復(fù)用模式:

①一個(gè)棧內(nèi)有ABCD四個(gè)Activity践盼,A位于棧底,D位于棧頂宾巍。此時(shí)啟動(dòng)D 咕幻,啟動(dòng)模式為SingleTop,因?yàn)镈在棧頂顶霞,D不會(huì)重新創(chuàng)建肄程,那么棧內(nèi)情況仍為ABCD。

②同樣选浑,一個(gè)棧內(nèi)有ABCD四個(gè)Activity蓝厌,A位于棧底,D位于棧頂古徒。啟動(dòng)D 拓提,模式為standard(標(biāo)準(zhǔn)模式),因?yàn)槊看螁?dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例隧膘,不管這個(gè)實(shí)例是否已經(jīng)存在代态,所以D會(huì)再次創(chuàng)建,那么棧內(nèi)的情況為ABCDD疹吃。

③同樣蹦疑,一個(gè)棧內(nèi)有ABCD四個(gè)Activity,A位于棧底互墓,D位于棧頂必尼。啟動(dòng)C, 模式為SingleTop篡撵,因?yàn)镃不在棧頂判莉,已經(jīng)存在,所以C會(huì)再次創(chuàng)建育谬,那么棧內(nèi)的情況為ABCDC券盅。

棧頂復(fù)用模式Activity啟動(dòng)示意圖

singleTask:棧內(nèi)復(fù)用模式

singleTask是一種單實(shí)例模式。此模式下膛檀,只要Activity在一個(gè)棧中存在锰镀,那么多次啟動(dòng)這個(gè)Activity都不會(huì)重新創(chuàng)建娘侍。

比如:Activity A以singleTask模式請(qǐng)求啟動(dòng),系統(tǒng)會(huì)先去尋找是否存在A想要的任務(wù)棧泳炉。如果不存在憾筏,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建A的實(shí)例花鹅,并放入到此棧中氧腰。如果存在A所需的任務(wù)棧,就看棧內(nèi)是否含有A的實(shí)例刨肃,若實(shí)例存在古拴,系統(tǒng)就會(huì)把A調(diào)至棧頂并調(diào)用它的onNewIntent方法;如果實(shí)例不存在真友,就創(chuàng)建A的實(shí)例并把A壓入棧中黄痪。

舉個(gè)三個(gè)栗子來(lái)理解Activity的棧內(nèi)復(fù)用模式:

①已有任務(wù)棧S1,棧內(nèi)有ABC三個(gè)Activity盔然,這個(gè)時(shí)候Activity D以singleTask模式請(qǐng)求啟動(dòng)桅打,其所需任務(wù)棧為S2,因?yàn)镾2和D的實(shí)例都不存在轻纪,所以系統(tǒng)會(huì)先創(chuàng)建任務(wù)棧S2油额,然后創(chuàng)建D的實(shí)例并入棧S2叠纷。

栗子1

②已有任務(wù)棧S1刻帚,棧內(nèi)有ABC三個(gè)Activity,這個(gè)時(shí)候Activity D以singleTask模式請(qǐng)求啟動(dòng)涩嚣,其所需任務(wù)棧為S1崇众,因?yàn)镾1已經(jīng)存在,所以系統(tǒng)就創(chuàng)建D的實(shí)例并入棧S1航厚。

栗子2

③已有任務(wù)棧S1顷歌,棧內(nèi)有ADBC四個(gè)Activity,此時(shí)棧內(nèi)Activity D以singleTask模式請(qǐng)求啟動(dòng)幔睬,因?yàn)镈實(shí)例已經(jīng)存在眯漩,所以不會(huì)重建。為了把D切到棧頂麻顶,D上面的Activity會(huì)依次出棧赦抖。最終棧內(nèi)只有AD。

栗子3

singleInstance:?jiǎn)螌?shí)例模式

singleInstance模式具有singleTask模式的所有特性辅肾,此外singleInstance模式的Activity只能單獨(dú)地位于一個(gè)任務(wù)棧中队萤。

比如:Activity是singleInstance模式,A啟動(dòng)后矫钓,系統(tǒng)為它創(chuàng)建一個(gè)新的任務(wù)棧要尔,然后A獨(dú)自在這個(gè)棧中舍杜,由于棧內(nèi)復(fù)用特性,后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的Activity赵辕,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷(xiāo)毀了既绩。


3.1.1 如何給指定的Activity指定啟動(dòng)模式?

①在AndroidMenifest指定Activity的啟動(dòng)模式

②通過(guò)在Intent中設(shè)置標(biāo)志位

二者區(qū)別:

兩種啟動(dòng)模式的區(qū)別

3.1.2? Activity的Flags

Activity常用的Flags

這里特別提下FLAG_ACTIVITY_CLEAR_TOP的一個(gè)使用場(chǎng)景还惠,現(xiàn)有四個(gè)頁(yè)面ABCD熬词,頁(yè)面A跳轉(zhuǎn)至B,B到C吸重,C到D互拾,在D頁(yè)面操作交易成功后返回至A頁(yè)面,注意嚎幸,D頁(yè)面若是按返回鍵則原路返回至C颜矿、B、A嫉晶,所以在B骑疆、C、D頁(yè)面跳轉(zhuǎn)就finish的方案不符合需求替废。這里FLAG_ACTIVITY_CLEAR_TOP就派上用場(chǎng)了箍铭,具體用法見(jiàn)截圖:

3.1.3 IntentFilter 的匹配規(guī)則

啟動(dòng)Activity分為顯示和隱式調(diào)用。隱式調(diào)用需要Intent能夠匹配目標(biāo)組件的IntentFilter中所設(shè)置的過(guò)濾信息椎镣,如果不匹配將無(wú)法啟動(dòng)目標(biāo)Activity诈火。

action的匹配規(guī)則:要求Intent中的action存在且必須和過(guò)濾規(guī)則中的其中一個(gè)action相同。action是字符串状答,區(qū)分大小寫(xiě)冷守。

category的匹配規(guī)則:Intent中的category可以不存在,如果存在惊科,則每個(gè)Intent中的category都要與規(guī)律規(guī)則的一致拍摇。

data的匹配規(guī)則:如果過(guò)濾規(guī)則中定義了data,那么Intent中也要定義可匹配的data馆截。

data的結(jié)構(gòu):mimeType和URI充活。

mineType:指媒體類型,可以表示圖片蜡娶、文本混卵、視頻等媒體格式。比如image/jpeg翎蹈、audio/mpeg4-generic淮菠、video/*等。

URI的結(jié)構(gòu):



感謝您耐心地讀到最后荤堪。在此特別說(shuō)明一下合陵,這是我拜讀大佬任玉剛老師的《Android 開(kāi)發(fā)藝術(shù)探索》一書(shū)整理出來(lái)的讀書(shū)筆記枢赔,文字、截圖都是我辛苦整理出來(lái)的拥知,相信大方的你會(huì)點(diǎn)贊的踏拜,對(duì)嗎?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末低剔,一起剝皮案震驚了整個(gè)濱河市速梗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌襟齿,老刑警劉巖姻锁,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異猜欺,居然都是意外死亡位隶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)开皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涧黄,“玉大人,你說(shuō)我怎么就攤上這事赋荆∷裢祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窄潭,是天一觀的道長(zhǎng)春宣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狈孔,這世上最難降的妖魔是什么信认? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任材义,我火速辦了婚禮均抽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘其掂。我一直安慰自己油挥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布款熬。 她就那樣靜靜地躺著深寥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贤牛。 梳的紋絲不亂的頭發(fā)上惋鹅,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音殉簸,去河邊找鬼闰集。 笑死沽讹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的武鲁。 我是一名探鬼主播爽雄,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沐鼠!你這毒婦竟也來(lái)了挚瘟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敲茄,沒(méi)想到半個(gè)月后娃豹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧漓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了监氢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片布蔗。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浪腐,靈堂內(nèi)的尸體忽然破棺而出纵揍,到底是詐尸還是另有隱情,我是刑警寧澤议街,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布泽谨,位于F島的核電站,受9級(jí)特大地震影響特漩,放射性物質(zhì)發(fā)生泄漏吧雹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一涂身、第九天 我趴在偏房一處隱蔽的房頂上張望雄卷。 院中可真熱鬧,春花似錦蛤售、人聲如沸丁鹉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揣钦。三九已至,卻和暖如春漠酿,著一層夾襖步出監(jiān)牢的瞬間冯凹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工炒嘲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宇姚,地道東北人团驱。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像空凸,于是被迫代替她去往敵國(guó)和親嚎花。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容