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