Android 中進程的級別以及 Service 的優先級

Android 中進程的級別以及 Service 的優先級

因爲在 bindService 啓動 service 的時候須要傳入 flag (能夠看一下這篇文章)Service ,這裏有介紹 flag 的做用,和啓動的 Service 的優先級有關係,通常傳入:BIND_AOUT_CREATE,這裏咱們須要瞭解一下 Android 中進程的優先級的狀況。前端

進程的五個經常使用級別:緩存

  • 前臺進程(Foreground process):前臺進程就是用戶當前要處理的全部事情都必需要使用的進程。知足下面的各類狀況則認爲是前臺進程。debug

    • 進程持有一個正在和用戶交互的 Activity。
    • 進程持有一個 Service,這個 Service 處於這幾種狀態:1. Service 與用戶正在交互的 Activity 綁定。 2. Service 是在前臺運行的。 3. Service 正在執行它的生命週期 onCreate() onStrarCommand,onDestroy。 4. 進程持有一個 BroadcastReceiver 這個 BroadcastReceiver 正在執行它的 onReceiver 方法。

    殺死前臺進程須要用戶交互,前臺進程的優先級最高code

  • 可見進程(Visible process):若是一個進程不含任何前臺的組件,但仍可被用戶在屏幕上看到。當知足下面任意一條的時候,進程被認爲是可見的。cdn

    • 進程持有一個 activity,這個 activity 不在前臺。可是仍然可見的狀況。
    • 進程持有一個 Service ,這個 Service 與一個可見的 Activity 綁定。

    可見的進程也被認爲很重要,通常不會被銷燬,除非是爲了保證全部前臺進程的運行而不得已不殺死可見進程的時候blog

  • 服務進程(Service process):若是一個進程中運行着一個 Service,這個 Service 是經過 startService() 開啓的,而且不屬於上面兩種較高優先級的狀況下,這個進程就是一個服務進程。儘管服務進程沒有和用戶能夠看到的東西綁定,可是它們通常在作的事情是用戶關心的,好比後臺播放音樂,後臺下載數據等。因此係統會盡可能維持它們的運行,除非系統內存不足以維持前臺進程和可見進程的運行須要(這句話和沒說同樣)生命週期

  • 後臺進程(Background process):若是進程不屬於上面三種狀況,可是進程持有一個用戶不可見的 activity (activity 的 onStop 被調用,可是 onDestroy 沒有被調用的狀態)就認爲進程是一個後臺進程。隊列

    後臺進程不直接影響用戶體驗,系統會爲了前臺進程、可見進程、服務進程而任意殺死後臺進程,一般狀況下會有不少後臺進程存在,他們會被保存在一個 LRU(least recently used)列表中,這樣就能夠確保用戶最近使用的 Activity 最後被銷燬,先銷燬時間最遠的 Activity。進程

  • 空進程:若是一個進程不包含任何活躍的應用組件,則認爲是空進程。例如:一個進程當中已經沒有數據運行了,可是內存當中還爲這個應用保留了一個進程空間。保存這種進程的惟一理由是爲了緩存的須要,爲了加快下次啓動這個進程中組件的啓動時間,這種空進程常常被殺死。內存

總結: 咱們已經知道有這 5 個進程了,而且他們的優先級都列出來的,這樣咱們就能夠根據優先級來讓咱們的 APP 儘可能不被殺死了。

下面再來講一下 BindService() 方法中的 flag 參數:

  • BIND_AUOT_CREATE:

    只要綁定存在就會自動建立這個 Service,雖然建立了 Service,可是它的 onStartCommand 方法是不會調用的,由於這個方法只有在 startService 的時候被調用。

    在 Android 4.0 之前,不提供這個標誌的話,會影響系統斷定當前 Service 進程的重要性(會把它認爲是後臺進程),當要設置的時候,告訴系統進程重要性的惟一方式是,經過 bindService 來實現,在這種狀況下,只有 Activity 在前臺纔會起做用。(這樣 Service 進程的優先級等同於啓動它的進程的優先級)。

    如今要想把 Service 進程的優先級下降,必須提供新的 falg (BIND_ADJUST_WITH_ACTIVITY)。考慮到兼容性,若是沒有指定 BIND_AUTO_CREATE 的時候,系統會自動加上 BIND_WAIVE_PRIORITY 和 BIND_ADJUST_WITH_ACTIVITY 來實現下降優先級的效果。由於在 Android 4.0 之前 Service 的優先級默認是後臺進程,在 Android 4.0 以後默認是等同於宿主進程,因此只有設置了 BIND_WAIVE_PRIORITY 後纔會 4.0 和 4.0之前都兼容起來被當作後臺任務對待。

  • BIND_DEBUG_UNBIND:

    用來 debug 使用的

  • BIND_NOT_FOREGROUND

    不容許將綁定的 Service 的進程提高到前臺進程的優先級,它將仍然擁有和客戶端一樣的內存優先級,因此在宿主進程沒有被殺死的狀況下,Service 的進程也是不會被殺死的。可是 cpu 可能會把它放在後臺執行。僅僅在這種狀況下會有做用,宿主進程在前端,Service 進程在後臺

  • BIND_ABOVE_CLIENT

    在這種狀況下,Service 進程比 App 自己的進程還有重要,當設置後,內存溢出的時候,將會在關閉 Service 進程前關閉 App 進程。可是這種狀況不能保證。

  • BIND_ALLOW_OOM_MANAGEMENT

    容許內存管理系統管理 Service 的進程,容許系統在內存不足的時候刪除這個進程。

  • BIND_WAIVE_PRIORITY

    不影響 Service 進程的優先級的狀況下,容許 Service 進程被加入後臺隊列中。

  • BIND_IMPORITANT

    這個服務對於這個客戶端來講是很是重要的,因此應該提高到前臺進程的級別。通常這個進程 會提高到可見的級別,甚至客戶端在後臺的時候。

  • BIND_ADJUST_WITH_ACTIVITY

    若是從一個 Activity 綁定,則這個 Service 進程的優先級和 Activity 是否對用戶可見有關。

好了,就介紹到這裏,因爲我的水平有限,有錯誤的地方,請各位不吝賜教!

因爲我的精力有限,多個渠道發佈,排版可能會有問題。重點維護 Android開發家園

Android 開發者家園
相關文章
相關標籤/搜索