1. 程式人生 > >android中程序優先順序

android中程序優先順序

之前被問到 如果系統的資源不足,導致一些程序要被 Kill 掉,那麼他們被殺死的先後順序是怎麼樣的 

這裡具體的說一下 優先順序順序由低到高:

1. 空程序:

是指不包含任何處於活動狀態(比如四大元件)的程序,那麼它存在的意義是什麼? 它是快取一些啟動資料, 方便下一次啟動程式。這只是我淺的理解,如果有其他有關空程序的理解, 請多多指教。

2. 後臺程序:

包含不可見的activity,在activity的生命週期中,使用者不可見即處於 onstop()方法呼叫後,系統為了保證優先順序更高的程序的執行,隨時可能殺死一個後臺程序。對於其生命週期, activity處於這個狀態還可以被重新啟動。

3. 服務程序:

包含已經啟動的service,所以,如果在service中執行比較耗時的操作,不能保證一定能執行完畢。

4. 可見程序:

可見程序分為以下兩種情況:

(1)程序包含未處於前臺但是可見的activity ,對應於生命週期的 呼叫了 onpause()方法,但是沒有呼叫 ondestory()方法,例如,執行activity時彈出對話方塊。

(2)程序中包含與可見activity繫結的service

5. 前臺程序:

前臺程序分為以下5中情況:

(1)程序中包含正與使用者互動的activity

(2)程序中包含與前臺activity繫結的service

(3)程序中包含正在執行oncreate() onstart() 或者ondestory()方法的service

(4)程序中包含呼叫了 startForeground()方法的service      這裡簡單說一下startForeground()這個方法,這是避免後臺執行的服務被強行殺死。在onstartCommand()裡呼叫startForeground()方法讓服務前臺執行,最後在 ondestory()方法裡呼叫 stopForeground()方法去掉。

(5)程序中包含正在執行 onReceive()方法的BroadcastReceiver。

其實在系統中,前臺程序的數量很少,前臺程序幾乎不會被殺死。

注意:

如果一個程序包含多個優先順序的活動元件,那麼該程序按優先順序最高的對待。比如說,一個程序包含已經啟動的service,也包含前臺activity,那麼這個程序就被看做是前臺程序。

 由於元件之間的依賴性, 程序的優先順序有可能被提高. 假如程序A服務於程序B, 則程序A的優先順序不能低於程序B. 比如, 程序A的ContentProvider元件正在服務於程序B的某個元件, 或者程序A的service元件和程序B的某個元件繫結等, 這些情況下, 程序A的優先順序都不會低於程序B(如果按照優先順序規則, 程序A的優先順序確實低於程序B, 則系統會選擇提高程序A的優先順序到和程序B相同).

由於服務程序的優先順序高於後臺程序, 因此如果activity需要執行耗時操作, 最好還是啟動一個service來完成. 當然, 在activity中啟動子執行緒完成耗時操作也可以, 但是這樣做的缺點在於, 一旦activity不再可見, activity所在的程序成為後臺程序, 而記憶體不足時後臺程序隨時都有可能被系統殺死(但是啟動service完成耗時操作會帶來資料互動的問題, 比如耗時操作需要實時更新UI控制元件的狀態的話, service就不是一個好的選擇). 基於同樣的考慮, 在BroadcastReceiver中也不應該執行耗時操作, 而應該啟動service來完成(當然, BroadcastReceiver的生命週期過於短暫, 也決定了不能在其中執行耗時操作).