1. 程式人生 > >從0開始認識android(十三):程序和APP的生命週期

從0開始認識android(十三):程序和APP的生命週期

  我們知道,APP的生命週期是無法自我做主的, 系統會在記憶體不不夠用的時候把後臺的程序幹掉,那系統是根據什麼判斷哪些程序應該被幹掉,哪些應該保留呢?
  其實,系統會根據每個APP中四大元件的整體執行狀態來將APP所在的程序分為不同的種類,以下就是系統區分的程序型別(被殺可能性由低到高):
  1.、前臺程序
  即使用者正在使用的app所在的程序,只要一個app的某些元件滿足以下某個狀態,那麼這個app所在的程序就可以被看做前臺程序:
  1.1、當某個activity正在與使用者互動時,即這個activity生命週期處於onResume狀態;
  1.2、當某個broadcastReceiver正在執行其onReceiver()方法中的程式碼時;
  1.3、當某個service正在執行其onCreate()或onStart()或onDestory()方法中的程式碼時。
  2、可視程序


  不是使用者正在互動的程序,但使用者能看見這個程序正在執行,如果把這個程序幹掉,使用者也能明顯的知道程序被幹掉了。滿足以下某個條件的程序即可視程序:
  2.1、某個activity對使用者可見,但是沒有獲取焦點,即生命週期處於onPause狀態。典型的例子是在當前介面彈出一個dialog,介面的焦點被dialog搶佔了。
  2.2、某個service通過Service.startForeground()的方法啟動,使用者可以在手機通知欄裡看到這個service的執行狀況。例如下載服務將下載進度顯示在通知欄裡。
  2.3、一些系統正在使用的服務(不是使用者使用,但使用者能感知這個服務正在執行),例如動態桌布、輸入法服務等。
  3、服務程序

  不是使用者正在互動的程序,如果存在通過startService()方法啟動在後臺執行的service,使用者看不見這個service,那麼這個程序就可以叫做服務程序。
  4、快取程序
  不是使用者正在互動的程序,之所以叫快取程序,是因為這類程序往往只持有一個或幾個執行了介面狀態快取邏輯的activity:在前面《從0開始認識android(十一):Activity生命週期》一文中我們知道:除了使用者通過手機返回鍵退出activity外,其他情況導致我們的activity進入stop狀態之前,我們的介面都會先走onSaveInstance()方法,在這裡我們就可以把當前介面的狀態儲存起來。
  當程序不是前臺程序,也不是可視程序或服務程序時,如果一個後臺程序持有少數幾個執行了介面狀態快取邏輯的activity,那麼這個程序就可以視為快取程序。
  所以,當系統記憶體吃緊時,被幹掉的後臺程序的可能性從大到小依次:快取程序——服務程序——可視程序。