1. 程式人生 > >Android中級教程之--------Android應用程式的生命週期(一定要理解,面試會問的哦!)

Android中級教程之--------Android應用程式的生命週期(一定要理解,面試會問的哦!)

Android的應用程式的生命週期,我相信這在以後的Android面試一定是經常考的題目,所以大家一點要重視哦!下面我將圖文雙執行緒,希望對大家有一點幫助!

首先我們看一下Android應用程式的生命週期圖:

        在大部份情況下,每個Android應用都將執行在自己的Linux程序當中。當這個應用的某些程式碼需要執行時,程序就會被建立,並且將保持執行,直到該程序不再需要,而系統需要釋放它所佔用的記憶體,為其他應用所用時,才停止。
        Android一個重要並且特殊的特性就是,一個應用的程序的生命週期不是由應用自身直接控制的,而是由系統,根據執行中的應用的一些特徵來決定的,包括:這些應用對使用者的重要性、系統的全部可用記憶體。
         對於應用開發者來說,理解不同的應用元件(特別是Activity

ServiceIntent Receiver)對應用程序的生命週期的影響,這是非常重要的。如果沒有正確地使用這些元件,將會導致當應用正在處理重要的工作時,程序卻被系統消毀的後果。
        對於程序生命週期,一個普遍的錯誤就是:當一個Intent Receiver在它的onReceiveIntent()方法中,接收到一個intent後,就會從這個方法中返回。而一旦從這個方法返回後,系統將會認為這個Intent Receiver不再處於活動狀態了,也就會認為它的宿主程序不需要了(除非宿主程序中還存在其它的應用元件)。從而,系統隨時都會消毀這個程序,收回記憶體,並中止其中還在執行的子執行緒。問題的解決辦法就是,在IntentReceiver
中,啟動一個Service,這樣系統就會知道在這個程序中,還有活動的工作正在執行。
         為了決定在記憶體不足情況下消毀哪個程序,Android會根據這些程序內執行的元件及這些元件的狀態,把這些程序劃分出一個“重要性層次”。這個層次按順序如下:
       1、前端程序是擁有一個顯示在螢幕最前端並與使用者做互動的Activity(它的onResume已被呼叫)的程序,也可能是一個擁有正在執行的IntentReceiver(它的onReceiveIntent()方法正在執行)的程序。在系統中,這種程序是很少的,只有當記憶體低到不足於支援這些程序的繼續執行,才會將這些程序消毀。通常這時候,裝置已經達到了需要進行記憶體整理的狀態,為了保障使用者介面不停止響應,只能消毀這些程序;
      2、可視程序是擁有一個使用者在螢幕上可見的,但並沒有在前端顯示的Activity
(它的onPause已被呼叫)的程序。例如:一個以對話方塊顯示的前端activity在螢幕上顯示,而它後面的上一級activity仍然是可見的。這樣的程序是非常重要的,一般不會被消毀,除非為了保障所有的前端程序正常執行,才會被消毀。
       3、服務程序是擁有一個由startService()方法啟動的Service的程序。儘管這些程序對於使用者是不可見的,但他們做的通常是使用者所關注的事情(如後臺MP3播放器或後臺上傳下載資料的網路服務)。因此,除非為了保障前端程序和可視程序的正常執行,系統才會消毀這種程序。
      4、後臺程序是擁有一個使用者不可見的ActivityonStop()方法已經被呼叫)的程序。這些程序不直接影響使用者的體驗。如果這些程序正確地完成了自己的生命週期(詳細參考Activity類),系統會為了以上三種類型程序,而隨時消毀這種程序以釋放記憶體。通常會有很多這樣的程序在執行著,因些這些程序會被儲存在一個LRU列表中,以保證在記憶體不足時,使用者最後看到的程序將在最後才被消毀。
      5、空程序是那些不擁有任何活動的應用元件的程序。保留這些程序的唯一理由是,做為一個快取,在它所屬的應用的元件下一次需要時,縮短啟動的時間。同樣的,為了在這些快取的空程序和底層的核心快取之間平衡系統資源,系統會經常消毀這些空程序。
      當要對一個程序進行分類時,系統會選擇在這個程序中所有活動的元件中重要等級最高的那個做為依據。可以參考ActivityServiceIntentReceiver文件,瞭解這些元件如何影響程序整個生命週期的更多細節。這些類的文件都對他們如何影響他們所屬的應用的整個生命週期,做了詳細的描述。