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

0 評論 14467 瀏覽 15 收藏 9 分鐘

這里說的應(yīng)用的生命周期不是說一個應(yīng)用從研發(fā)到上線的產(chǎn)品層面的生命周期,而是應(yīng)用自身運行的生命周期。雖然這兩個生命周期的概念是不一樣的,但是在生命的層面上都有從產(chǎn)生到消亡的過程,二者在這點上是一致的。

應(yīng)用的生命周期是應(yīng)用在宿主的環(huán)境中從創(chuàng)建,運行,到消亡的一種過程描述,對用戶來說一個直觀的感受是一個應(yīng)用啟動了,應(yīng)用退出了,應(yīng)用后臺了。實際上,一個應(yīng)用在實際運行的過程中會有很多生命周期的狀態(tài)描述,以一個Android的應(yīng)用為例:

filehelper_1464920296155_37

這個圖中的Activity我們可以簡單的理解為呈現(xiàn)給用戶的應(yīng)用界面,可以看到這里有八種狀態(tài)在按照一定的順序進行切換,上半部分屬于創(chuàng)建,下半部分屬于消亡,但是整個過程并不是完全不可走回頭路的,消亡路徑上生命周期也可以跳轉(zhuǎn)到對應(yīng)的創(chuàng)建路徑上的生命周期。應(yīng)用的生命周期不是由應(yīng)用開發(fā)者控制的,開發(fā)者只可以發(fā)出一些指令給宿主系統(tǒng),比如啟動一個Activity,退出一個Activity,宿主系統(tǒng)就開始操控Activity或創(chuàng)建或銷毀,并把整個過程中的關(guān)鍵節(jié)點通知給應(yīng)用開發(fā)者。

這里的每個節(jié)點都有自己的意義:

onCreate表示應(yīng)用開始創(chuàng)建了,但這個時候應(yīng)用的界面并沒有展現(xiàn)個用戶,開發(fā)者可以在這里創(chuàng)建需要展現(xiàn)的數(shù)據(jù),以及構(gòu)建一些視圖,其實系統(tǒng)處理應(yīng)用繪制還是比較快的,但是我們經(jīng)常發(fā)現(xiàn)有些應(yīng)用從桌面點擊啟動半天沒反應(yīng),過了好一會才彈出界面,問題就出在這里,很多應(yīng)用在開發(fā)時將大量耗時操作寫在了這個生命周期中,卡住了后續(xù)界面繪制的相關(guān)操作。

例如一個軟件中有大量的數(shù)據(jù)存在數(shù)據(jù)庫,開發(fā)者希望應(yīng)用一啟動就能將數(shù)據(jù)以列表的形式展現(xiàn)給用戶,因此在onCreate中讀取了大量的數(shù)據(jù),并構(gòu)建了一個很長的列表,那么在這一切準備好之前,用戶看到的就是點了半天沒動靜,體驗自然不好,但是數(shù)據(jù)和視圖沒有準備好就將界面展示給用戶,用戶不就看到空白的界面了嗎?是的,但是很多時候程序設(shè)計時采用了一些規(guī)避的辦法,在卡頓和空白頁之間尋找一個平衡點,例如只讀取少量的數(shù)據(jù),構(gòu)建少量的視圖,盡快將界面展現(xiàn)個用戶后,再去加載更多的數(shù)據(jù)和視圖,還有一種簡單粗暴的辦法就是閃屏,onCreate這個生命周期就貼張圖,盡快讓程序進入繪制流程,等用戶看到閃屏了,再去慢慢加載數(shù)據(jù)視圖,這樣至少不會等的無聊和莫名其妙。當然很多用戶不喜歡閃屏,感覺上還是慢的帶鹽人,所以還有種做法就是退出時將應(yīng)用截圖保存,啟動時用之前的截圖做閃屏,這樣應(yīng)用的啟動至少看起來要快一些。

onStart,onResume依次在onCreate之后被調(diào)用,但是應(yīng)用還未進入running,為什么還要拆出這細分的中間狀態(tài)呢,這個就需要結(jié)合onPause,onStop一起說明了。從生命周期的圖中我們可以看到,onCreate是不可重入(一個完整的生命周期中反復(fù)調(diào)用)的,而onStart,onResume,onPause,onStop是可以重入的。當界面已經(jīng)呈現(xiàn)給用戶,但是這個時候有個彈框擋住了部分應(yīng)用的界面,但是應(yīng)用界面還是可見,這時應(yīng)用進入了onPause狀態(tài),當彈窗消失后,應(yīng)用進入了onResume狀態(tài),但是如果不是彈窗,而是其它應(yīng)用啟動完全擋住了當前的應(yīng)用界面,那么當前應(yīng)用就進入了onStop狀態(tài),當遮擋的應(yīng)用消失后,被遮擋的應(yīng)用則又會回到onStart狀態(tài)(中間還有一個onRestart狀態(tài),和onStart狀態(tài)的區(qū)別在于它不會在這個生命周期開始的過程中被調(diào)用),當然不僅是被其它應(yīng)用遮住,用戶主動后臺這種導(dǎo)致應(yīng)用不可見的情況也會觸發(fā)到onStop,在很多優(yōu)化中,當應(yīng)用不可見時,開發(fā)者會主動釋放應(yīng)用的部分資源,減少系統(tǒng)消耗,讓出更多的資源給其它應(yīng)用。

而onDestroy則是onCreate的對立面,一旦應(yīng)用到了onDestroy的階段,就沒法像onPause,onStop一樣走回頭路了。通常這個生命周期都是應(yīng)用開發(fā)者向系統(tǒng)發(fā)出了退出應(yīng)用的指令后,系統(tǒng)在銷毀Activity的時候回調(diào)的。而退出應(yīng)用也很容易出現(xiàn)像onCreate一樣的問題,例如我們經(jīng)??吹接行?yīng)用點了退出后會卡一下,然后消失,看了之前onCreate的分析,這里的原因也很容易分析了,即用戶點擊了退出按鈕后,應(yīng)用開發(fā)者向系統(tǒng)發(fā)出了關(guān)閉Activity的指令,同時開發(fā)者做了許多銷毀資源的耗時操作,而這個時候應(yīng)用界面仍然是可見的,這些操作卡住了后續(xù)的界面銷毀流程,所以給用戶的感受就是點了退出之后頓住了一會。解決辦法也很簡單,在程序退出流程中界面不可見后的生命周期中去做耗時操作,這樣界面沒有擋住用戶做其它的事情,用戶就感覺不到了。

如果上面的不太好理解,我們可以這樣去看這些生命周期,onCreate(人出生),onStart(人醒來),onResume(人睜開眼),onPause(人閉上眼),onStop(人睡著),onDestroy(人死亡)。出生和死亡不可逆,而醒睡,睜閉眼則在人的一身中不斷反復(fù),先要閉眼然后睡著,醒了之后會睜開眼睛開始活動。出生后會經(jīng)歷醒來,睜眼,拜了個拜前也會經(jīng)歷閉眼,沉睡,應(yīng)了小沈陽那句:眼睛一閉一睜,一天過去了,一閉不睜,一輩子就過去了(我們不考慮睜眼睡的特異人士,和死不瞑目的特殊情況)。

了解這些生命周期后,再去把玩自己的或是別人的應(yīng)用,就可以感受到程序設(shè)計優(yōu)劣了,偶爾還能提點建設(shè)性的意見了。

(PS. IOS應(yīng)用也有類似類似的生命周期的描述)

#專欄作家#

給產(chǎn)品經(jīng)理講技術(shù),微信公眾號(pm_teacher),人人都是產(chǎn)品經(jīng)理專欄作家。資深程序猿,專注客戶端開發(fā)若干年,對前端、后臺技術(shù)略懂,熱衷于對新的科技領(lǐng)域的探索。

本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,不得轉(zhuǎn)載。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發(fā)揮!