Android進程級別

Android中,同一個應用的所有組件在默認情況下都運行在同一個進程中,但也可以通過修改manifest文件中的android:process屬性來指定該組件要運行中那個進程,也可以讓不同應用的組件們運行在同一個進程中,當然這些應用要共享一個用戶ID並並且有相同的數字證書。

Android可能在某個時刻決定關閉一個進程,當決定要關閉那些進程的時候,系統會衡量每個進程與用戶的緊密程度,這時候就跟Android中進程的級別有關了。像一個具有可見的activity的進程要比那些activity都是不可見的進程擁有更高的等級,更不容易被系統殺死。那麼Android的進程等級有那些呢?首先,我們可以看一張圖:

 

 

上面的圖片就是Android系統中不同類型的進程和他們的優先級了。下面是每個進程的介紹。

1、前臺進程

用戶當前正在做的事情需要這個進程。如果滿足下面的條件之一,一個進程就被認爲是前臺進程:

這個進程擁有一個正在與用戶交互的Activity(這個Activity的onResume()方法被調用)

這個進程擁有一個綁定到正在與用戶交互的activity上的Service。

這個進程擁有一個前臺運行的Service(service調用了方法startForeground()).

這個進程擁有一個正在執行其任何一個生命週期回調方法(onCreate(),onStart(),或onDestroy())的Service。

這個進程擁有正在執行其onReceive()方法的BroadcastReceiver。


通常,在任何時間點,只有很少的前臺進程存在。它們只有在達到無法調合的矛盾時纔會被殺--如內存太小而不能繼續運行時。通常,到了這時,設備就達到了一個內存分頁調度狀態,所以需要殺一些前臺進程來保證用戶界面的反應

2、可見進程

一個進程不擁有運行於前臺的組件,但是依然能影響用戶所見。滿足下列條件時,進程即爲可見:

這個進程擁有一個不在前臺但仍可見的Activity(它的onPause()方法被調用)當一個前臺activity啓動一個對話框時,就出了這種情況。

3、服務進程

一個可見進程被認爲是極其重要的。並且,除非只有殺掉它纔可以保證所有前臺進程的運行,否則是不能動它的。

這個進程擁有一個綁定到可見activity的Service。

一個進程不在上述兩種之內,但它運行着一個被startService()所啓動的service。

儘管一個服務進程不直接影響用戶所見,但是它們通常做一些用戶關心的事情(比如播放音樂或下載數據),所以系統不到前臺進程和可見進程活不下去時不會殺它。

4、後臺進程

一個進程擁有一個當前不可見的activity(activity的onStop()方法被調用)。

這樣的進程們不會直接影響到用戶體驗,所以系統可以在任意時刻殺了它們從而爲前臺、可見、以及服務進程們提供存儲空間。通常有很多後臺進程在運行。它們被保存在一個LRU(最近最少使用)列表中來確保擁有最近剛被看到的activity的進程最後被殺。如果一個activity正確的實現了它的生命週期方法,並保存了它的當前狀態,那麼殺死它的進程將不會對用戶的可視化體驗造成影響。因爲當用戶返回到這個activity時,這個activity會恢復它所有的可見狀態。

5、空進程

一個進程不擁有入何active組件。

保留這類進程的唯一理由是高速緩存,這樣可以提高下一次一個組件要運行它時的啓動速度。系統經常爲了平衡在進程高速緩存和底層的內核高速緩存之間的整體系統資源而殺死它們。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章