close

                                                                 

 

這裡說的應用的生命週期不是說一個應用從研發到上線的產品層面的生命週期,而是應用自身運行的生命週期。雖然這兩個生命週期的概念是不一樣的,但是在生命的層面上都有從產生到消亡的過程,二者在這點上是一致的。

 

應用的生命週期是應用在宿主的環境中從創建,運行,到消亡的一種過程描述,對用戶來說一個直觀的感受是一個應用啟動了,應用退出了,應用後臺了。實際上,一個應用在實際運行的過程中會有很多生命週期的狀態描述,以一個Android的應用為例:

 

這個圖中的Activity我們可以簡單的理解為呈現給使用者的應用介面,可以看到這裡有八種狀態在按照一定的順序進行切換,上半部分屬於創建,下半部分屬於消亡,但是整個過程並不是完全不可走回頭路的,消亡路徑上生命週期也可以跳轉到對應的創建路徑上的生命週期。應用的生命週期不是由應用開發者控制的,開發者只可以發出一些指令給宿主系統,比如啟動一個Activity,退出一個Activity,宿主系統就開始操控Activity或創建或銷毀,並把整個過程中的關鍵節點通知給應用開發者。

這裡的每個節點都有自己的意義:

onCreate表示應用開始創建了,但這個時候應用的介面並沒有展現個使用者,開發者可以在這裡創建需要展現的資料,以及構建一些視圖,其實系統處理應用繪製還是比較快的,但是我們經常發現有些應用從桌面點擊啟動半天沒反應,過了好一會才彈出介面,問題就出在這裡,很多應用在開發時將大量耗時操作寫在了這個生命週期中,卡住了後續介面繪製的相關操作。

例如一個軟體中有大量的資料存在資料庫,開發者希望應用一啟動就能將資料以清單的形式展現給用戶,因此在onCreate中讀取了大量的資料,並構建了一個很長的列表,那麼在這一切準備好之前,用戶看到的就是點了半天沒動靜,體驗自然不好,但是資料和視圖沒有準備好就將介面展示給使用者,使用者不就看到空白的介面了嗎?是的,但是很多時候程式設計時採用了一些規避的辦法,在卡頓和空白頁之間尋找一個平衡點,例如唯讀取少量的資料,構建少量的視圖,儘快將介面展現個使用者後,再去載入更多的資料和視圖,還有一種簡單粗暴的辦法就是閃屏,onCreate這個生命週期就貼張圖,儘快讓程式進入繪製流程,等使用者看到閃屏了,再去慢慢載入資料視圖,這樣至少不會等的無聊和莫名其妙。當然很多用戶不喜歡閃屏,感覺上還是慢的帶鹽人,所以還有種做法就是退出時將應用截圖保存,啟動時用之前的截圖做閃屏,這樣應用的啟動至少看起來要快一些。

onStart,onResume依次在onCreate之後被調用,但是應用還未進入running,為什麼還要拆出這細分的中間狀態呢,這個就需要結合onPauseonStop一起說明了。從生命週期的圖中我們可以看到,onCreate是不可重入(一個完整的生命週期中反復調用)的,而onStartonResumeonPauseonStop是可以重入的。當介面已經呈現給使用者,但是這個時候有個彈框擋住了部分應用的介面,但是應用介面還是可見,這時應用進入了onPause狀態,當彈窗消失後,應用進入了onResume狀態,但是如果不是彈窗,而是其它應用啟動完全擋住了當前的應用介面,那麼當前應用就進入了onStop狀態,當遮擋的應用消失後,被遮擋的應用則又會回到onStart狀態(中間還有一個onRestart狀態,和onStart狀態的區別在於它不會在這個生命週期開始的過程中被調用),當然不僅是被其它應用遮住,用戶主動後臺這種導致應用不可見的情況也會觸發到onStop,在很多優化中,當應用不可見時,開發者會主動釋放應用的部分資源,減少系統消耗,讓出更多的資源給其它應用。

onDestroy則是onCreate的對立面,一旦應用到了onDestroy的階段,就沒法像onPauseonStop一樣走回頭路了。通常這個生命週期都是應用開發者向系統發出了退出應用的指令後,系統在銷毀Activity的時候回檔的。而退出應用也很容易出現像onCreate一樣的問題,例如我們經常看到有些應用點了退出後會卡一下,然後消失,看了之前onCreate的分析,這裡的原因也很容易分析了,即使用者點擊了退出按鈕後,應用開發者向系統發出了關閉Activity的指令,同時開發者做了許多銷毀資源的耗時操作,而這個時候應用介面仍然是可見的,這些操作卡住了後續的介面銷毀流程,所以給使用者的感受就是點了退出之後頓住了一會。解決辦法也很簡單,在程式退出流程中介面不可見後的生命週期中去做耗時操作,這樣介面沒有擋住使用者做其它的事情,用戶就感覺不到了。

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

瞭解這些生命週期後,再去把玩自己的或是別人的應用,就可以感受到程式設計優劣了,偶爾還能提點建設性的意見了。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 微社群馬丁 的頭像
    微社群馬丁

    馬丁跟你說

    微社群馬丁 發表在 痞客邦 留言(0) 人氣()