應(yīng)用的生命周期是什么?

這里說的應(yīng)用的生命周期不是說一個(gè)應(yīng)用從研發(fā)到上線的產(chǎn)品層面的生命周期,而是應(yīng)用自身運(yùn)行的生命周期。雖然這兩個(gè)生命周期的概念是不一樣的,但是在生命的層面上都有從產(chǎn)生到消亡的過程,二者在這點(diǎn)上是一致的。
應(yīng)用的生命周期是應(yīng)用在宿主的環(huán)境中從創(chuàng)建,運(yùn)行,到消亡的一種過程描述,對(duì)用戶來說一個(gè)直觀的感受是一個(gè)應(yīng)用啟動(dòng)了,應(yīng)用退出了,應(yīng)用后臺(tái)了。實(shí)際上,一個(gè)應(yīng)用在實(shí)際運(yùn)行的過程中會(huì)有很多生命周期的狀態(tài)描述,以一個(gè)Android的應(yīng)用為例:
這個(gè)圖中的Activity我們可以簡(jiǎn)單的理解為呈現(xiàn)給用戶的應(yīng)用界面,可以看到這里有八種狀態(tài)在按照一定的順序進(jìn)行切換,上半部分屬于創(chuàng)建,下半部分屬于消亡,但是整個(gè)過程并不是完全不可走回頭路的,消亡路徑上生命周期也可以跳轉(zhuǎn)到對(duì)應(yīng)的創(chuàng)建路徑上的生命周期。應(yīng)用的生命周期不是由應(yīng)用開發(fā)者控制的,開發(fā)者只可以發(fā)出一些指令給宿主系統(tǒng),比如啟動(dòng)一個(gè)Activity,退出一個(gè)Activity,宿主系統(tǒng)就開始操控Activity或創(chuàng)建或銷毀,并把整個(gè)過程中的關(guān)鍵節(jié)點(diǎn)通知給應(yīng)用開發(fā)者。
這里的每個(gè)節(jié)點(diǎn)都有自己的意義:
onCreate表示應(yīng)用開始創(chuàng)建了,但這個(gè)時(shí)候應(yīng)用的界面并沒有展現(xiàn)個(gè)用戶,開發(fā)者可以在這里創(chuàng)建需要展現(xiàn)的數(shù)據(jù),以及構(gòu)建一些視圖,其實(shí)系統(tǒng)處理應(yīng)用繪制還是比較快的,但是我們經(jīng)常發(fā)現(xiàn)有些應(yīng)用從桌面點(diǎn)擊啟動(dòng)半天沒反應(yīng),過了好一會(huì)才彈出界面,問題就出在這里,很多應(yīng)用在開發(fā)時(shí)將大量耗時(shí)操作寫在了這個(gè)生命周期中,卡住了后續(xù)界面繪制的相關(guān)操作。
例如一個(gè)軟件中有大量的數(shù)據(jù)存在數(shù)據(jù)庫(kù),開發(fā)者希望應(yīng)用一啟動(dòng)就能將數(shù)據(jù)以列表的形式展現(xiàn)給用戶,因此在onCreate中讀取了大量的數(shù)據(jù),并構(gòu)建了一個(gè)很長(zhǎng)的列表,那么在這一切準(zhǔn)備好之前,用戶看到的就是點(diǎn)了半天沒動(dòng)靜,體驗(yàn)自然不好,但是數(shù)據(jù)和視圖沒有準(zhǔn)備好就將界面展示給用戶,用戶不就看到空白的界面了嗎?是的,但是很多時(shí)候程序設(shè)計(jì)時(shí)采用了一些規(guī)避的辦法,在卡頓和空白頁之間尋找一個(gè)平衡點(diǎn),例如只讀取少量的數(shù)據(jù),構(gòu)建少量的視圖,盡快將界面展現(xiàn)個(gè)用戶后,再去加載更多的數(shù)據(jù)和視圖,還有一種簡(jiǎn)單粗暴的辦法就是閃屏,onCreate這個(gè)生命周期就貼張圖,盡快讓程序進(jìn)入繪制流程,等用戶看到閃屏了,再去慢慢加載數(shù)據(jù)視圖,這樣至少不會(huì)等的無聊和莫名其妙。當(dāng)然很多用戶不喜歡閃屏,感覺上還是慢的帶鹽人,所以還有種做法就是退出時(shí)將應(yīng)用截圖保存,啟動(dòng)時(shí)用之前的截圖做閃屏,這樣應(yīng)用的啟動(dòng)至少看起來要快一些。
onStart,onResume依次在onCreate之后被調(diào)用,但是應(yīng)用還未進(jìn)入running,為什么還要拆出這細(xì)分的中間狀態(tài)呢,這個(gè)就需要結(jié)合onPause,onStop一起說明了。從生命周期的圖中我們可以看到,onCreate是不可重入(一個(gè)完整的生命周期中反復(fù)調(diào)用)的,而onStart,onResume,onPause,onStop是可以重入的。當(dāng)界面已經(jīng)呈現(xiàn)給用戶,但是這個(gè)時(shí)候有個(gè)彈框擋住了部分應(yīng)用的界面,但是應(yīng)用界面還是可見,這時(shí)應(yīng)用進(jìn)入了onPause狀態(tài),當(dāng)彈窗消失后,應(yīng)用進(jìn)入了onResume狀態(tài),但是如果不是彈窗,而是其它應(yīng)用啟動(dòng)完全擋住了當(dāng)前的應(yīng)用界面,那么當(dāng)前應(yīng)用就進(jìn)入了onStop狀態(tài),當(dāng)遮擋的應(yīng)用消失后,被遮擋的應(yīng)用則又會(huì)回到onStart狀態(tài)(中間還有一個(gè)onRestart狀態(tài),和onStart狀態(tài)的區(qū)別在于它不會(huì)在這個(gè)生命周期開始的過程中被調(diào)用),當(dāng)然不僅是被其它應(yīng)用遮住,用戶主動(dòng)后臺(tái)這種導(dǎo)致應(yīng)用不可見的情況也會(huì)觸發(fā)到onStop,在很多優(yōu)化中,當(dāng)應(yīng)用不可見時(shí),開發(fā)者會(huì)主動(dòng)釋放應(yīng)用的部分資源,減少系統(tǒng)消耗,讓出更多的資源給其它應(yīng)用。
而onDestroy則是onCreate的對(duì)立面,一旦應(yīng)用到了onDestroy的階段,就沒法像onPause,onStop一樣走回頭路了。通常這個(gè)生命周期都是應(yīng)用開發(fā)者向系統(tǒng)發(fā)出了退出應(yīng)用的指令后,系統(tǒng)在銷毀Activity的時(shí)候回調(diào)的。而退出應(yīng)用也很容易出現(xiàn)像onCreate一樣的問題,例如我們經(jīng)??吹接行?yīng)用點(diǎn)了退出后會(huì)卡一下,然后消失,看了之前onCreate的分析,這里的原因也很容易分析了,即用戶點(diǎn)擊了退出按鈕后,應(yīng)用開發(fā)者向系統(tǒng)發(fā)出了關(guān)閉Activity的指令,同時(shí)開發(fā)者做了許多銷毀資源的耗時(shí)操作,而這個(gè)時(shí)候應(yīng)用界面仍然是可見的,這些操作卡住了后續(xù)的界面銷毀流程,所以給用戶的感受就是點(diǎn)了退出之后頓住了一會(huì)。解決辦法也很簡(jiǎn)單,在程序退出流程中界面不可見后的生命周期中去做耗時(shí)操作,這樣界面沒有擋住用戶做其它的事情,用戶就感覺不到了。
如果上面的不太好理解,我們可以這樣去看這些生命周期,onCreate(人出生),onStart(人醒來),onResume(人睜開眼),onPause(人閉上眼),onStop(人睡著),onDestroy(人死亡)。出生和死亡不可逆,而醒睡,睜閉眼則在人的一身中不斷反復(fù),先要閉眼然后睡著,醒了之后會(huì)睜開眼睛開始活動(dòng)。出生后會(huì)經(jīng)歷醒來,睜眼,拜了個(gè)拜前也會(huì)經(jīng)歷閉眼,沉睡,應(yīng)了小沈陽那句:眼睛一閉一睜,一天過去了,一閉不睜,一輩子就過去了(我們不考慮睜眼睡的特異人士,和死不瞑目的特殊情況)。
了解這些生命周期后,再去把玩自己的或是別人的應(yīng)用,就可以感受到程序設(shè)計(jì)優(yōu)劣了,偶爾還能提點(diǎn)建設(shè)性的意見了。
(PS. IOS應(yīng)用也有類似類似的生命周期的描述)
#專欄作家#
給產(chǎn)品經(jīng)理講技術(shù),微信公眾號(hào)(pm_teacher),人人都是產(chǎn)品經(jīng)理專欄作家。資深程序猿,專注客戶端開發(fā)若干年,對(duì)前端、后臺(tái)技術(shù)略懂,熱衷于對(duì)新的科技領(lǐng)域的探索。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,不得轉(zhuǎn)載。
- 目前還沒評(píng)論,等你發(fā)揮!