android程式與執行緒詳解一:程式

yangxi_001發表於2013-11-19

當一個應用的元件開始執行,並且這個應用沒有其它的元件在執行,系統會為這個應用啟動一個新的Linux程式,這個程式只有一個執行緒.預設情況下,一個應用的所有元件都執行在一個程式和執行緒(主執行緒)中.如果一個應用的元件開始執行,並且已經存在這個應用的執行緒了(因為這個應用的另一個元件已經執行了),於是這個元件就會在這個已有的程式中啟動並且執行在同一執行緒中.然而,你完全可以安排不同的元件執行於不同的程式,並且你可以為任何程式建立另外的執行緒.


程式

預設下,同一個應用的所有元件都執行在同一個程式中並且大多數程式不必改變這一狀況.然而,如果你非要與眾不同,也可以通過修改manifest檔案實現.

manifest檔案中的所有支援android:process屬性的那些項(<activity>,<service>, <receiver>,<provider>)都可以指定一個程式,於是這些元件就會在這個程式中執行.你可以設定這個屬性使每個元件執行於其自己的程式或只是其中一些元件共享一個程式.你也可以設定android:process以使不同應用的元件們可以執行於同一個程式—假如這些應用共享同一個使用者ID並且有相同的數字證書.

<application>元素也支援android:process屬性,用於為所有的元件指定一個預設值.

Android可能在某些時刻決定關閉一個程式,比如記憶體很少了並且另一個程式更迫切的需要啟動時.程式被關閉時,其中的元件們都被銷燬.如果重新需要這些元件工作時,程式又會被建立出來.

當決定關閉哪些程式時,Android系統會衡量各程式與使用者的緊密程度.例如,比起一個具有可見的activity的程式,那些所含有的activity是全部不可見的程式更容易被關閉.如何決定一個程式是否被關閉,取決於程式中執行的元件們的狀態.決定關閉程式的規則將在下面討論.

程式的生命期

Android系統會盡量維持一個程式的生命,直到最終需要為新的更重要的程式騰出記憶體空間。為了決定哪個該殺哪個該留,系統會跟據執行於程式內的元件的和元件的狀態把程式置於不同的重要性等級。當需要系統資源時,重要性等級越低的先被淘汰。

重要性等級被分為5個檔。下面列出了不同型別的程式的重要性等級(第一個程式型別是最重要的,也是最後才會被殺的):

1前臺程式


使用者當前正在做的事情需要這個程式。如果滿足下面的條件,一個程式就被認為是前臺程式:

這個程式擁有一個正在與使用者互動的Activity(這個ActivityonResume()方法被呼叫)

這個程式擁有一個繫結到正在與使用者互動的activity上的Service

這個程式擁有一個前臺執行的Service — service呼叫了方法startForeground().

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

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


通常,在任何時間點,只有很少的前臺程式存在。它們只有在達到無法調合的矛盾時才會被殺--如記憶體太小而不能繼續執行時。通常,到了這時,裝置就達到了一個記憶體分頁排程狀態,所以需要殺一些前臺程式來保證使用者介面的反應

2可見程式

一個程式不擁有執行於前臺的元件,但是依然能影響使用者所見。滿足下列條件時,程式即為可見:

這個程式擁有一個不在前臺但仍可見的Activity(它的onPause()方法被呼叫)。當一個前臺activity啟動一個對話方塊時,就出了這種情況。

3服務程式

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

這個程式擁有一個繫結到可見activityService

一個程式不在上述兩種之內,但它執行著一個被startService()所啟動的service

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


4後臺程式

一個程式擁有一個當前不可見的activity(activityonStop()方法被呼叫)

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


5空程式

一個程式不擁有入何active元件。

保留這類程式的唯一理由是快取記憶體,這樣可以提高下一次一個元件要執行它時的啟動速度。系統經常為了平衡在程式快取記憶體和底層的核心快取記憶體之間的整體系統資源而殺死它們。


跟據程式中當前活動的元件的重要性,Android會把程式按排在其可能的最高階別。例如,如果一個程式擁有一個service和一個可見的activity,程式會被定為可見程式,而不是服務程式。

另外,如果被其它程式所依賴,一個程式的級別可能會被提高—一個服務於其它程式的程式,其級別不可能比被服務程式低。

因為擁有service的程式比擁有後臺activitie的程式級別高,所以當一個activity啟動一個需長時間執行的操作時,最好是啟動一個服務,而不是簡單的建立一個工作執行緒。尤其是當這個操作可能比activity的生命還要長時。例如,一個向網站上傳圖片的activity,應該啟動一個service,從而使上傳操作可以在使用者離開這個activity時繼續在後臺執行。使用一個service保證了這個操作至少是在"服務程式"級別,而不用管activity是否發生了什麼不幸。這同樣是廣播接收者應該使用service而不是簡單地使用一個執行緒的理由。


相關文章