星期六, 8月 27, 2011

進程與執行緒Processes and Thread

Andoird應用程式筆記

今天試著了解運行應用程式的process與thread。

當一個應用程式的組件開始運行且任何其他應用程式組件都沒有在運行時,android系統為執行有一執行續的應用程式啟動一個新的linux進程。預設為同一應用程式的所有組件會運行在同一進程與執行續中。如果有一應用程式組件啟動而應用程式已存在於進程(因為其他應用程式組件已存在),組件會被啟動在相同的進程與執行緒中。然而你可以分配應用程式中的組件運行於不同進程中,且你可以在任何進程中增加執行續。

Processes(以下稱作"進程")

預設為同應用程式的所有組件運行於同一進程中,而大部分應用程式不應該改變這個預設狀態。然而,如果你發現你必須控制屬於一些組件的進程,你可以在manifest檔案中做到。

manifest檔案中為每種組件的元件,<activity>、<service>、<reciever>與<provoder>支援一個android:process屬性指定組件可以運行在進程。你可以設定這一屬性讓每個組件擁有自己的進程或者一些組件分享一個進程。你也可以設定android:process讓不同應用程式的組件運行在一個進程中。

<application>元件也支援android:process屬性去設定一個預設值應用在所有組件。

android可能在一些點會決定關閉進程,當記憶體不夠與其他必須立即服務使用者的組件的要求。運行應用程式組件的進程被殺掉後,應用程式因此被銷毀。當有要為組件工作時,進程再次為這些組件啟動。

當決定哪些進程要殺掉後,android系統權重它們對使用者的重要性。例如系統更容易關閉一個主持已不再顯示在螢幕的activity組件的進程,比起主持顯示在螢幕的activity組件的進程。根據組件運行在進程中的狀態決定是否終結進程。以下是一些終結進程的原則討論。

Process lifecycle
android系統試著維護應用程式進程盡可能的久,但是即使如此仍需要為新的或更重要的進程移除舊的進程回收記憶體。決定那些進程保留那些殺掉,系統根據組件運行在進程中的狀態將每個進程放置到"importance hierachy"中。較不重要的進程會最先被移除,如此繼續,當有需要回復系統資源時。

在importance hierachy中有五層,以下列出不同型態的進程的重要性(第一個型態進程是最重要也是最晚被殺掉的)。

1.Foreground process
進程是被當前使用者需要的。進程如果在以下情況被人為是foreground的:

  • 它主持一個正在與使用者互動的Activity(Activity的onResume()方法已經被呼叫)。
  • 它主持一個綁定正在與使用者互動的Actvity的Service。
  • 它主持一個正在"前台"運行的Service,Service已經呼叫startForeground()。
  • 它主持一個正在執行生命週期中的其中一個回呼的Service(onCreate()、onStart()、onDestory())。
  • 它主持一個正在執行onReceive方法的BroadReveiver。
通常,只有少數foreground processes存在於任何給定的時間。它們只在如果記憶體低到所有foreground processes無法繼續運行時被殺掉為最後手段。通常如果走到這一步,會殺掉一些foreground processes以便保持使用者介面的回應。

2.Visible process
進程沒有任何前台組件,但是仍能影響使用者在螢幕上所看到的事。如果以下條件其中一個為真,進程被認為是visible process:

  • 它主持一個不是foreground的Activity,但是仍然是對使用者是可見的(onPause()方法已經被呼叫)。這樣情況有可能發生,例如,如果前台activity組件啟動一個對話,在前台activity組件背後的前一個activity組件允許被看見。
  • 它主持一個綁定在可見(前台)的activity上的service。
visible process被認為是非常重要的且不會被殺掉,除非殺掉進程可以保持前台進程繼續運行。

3.Service process
進程正在運行一個已被startService()啟動的Service且進程不是前面兩個更高的類別。雖然service process無法直接給任何使用者看見,它們通常做的事是使用者在意的,例如播放背景音樂或從網路下載資料,所以系統保持它們運行,除非沒有足夠的記憶體保留它們。

4.Background process
進程正保存一個使用者近期看不見的activity組件(activity的onStop()已經被呼叫)。這些進程對於使用者經驗沒有直接的影響,而且系統能在任何時間為foreground、visible或service進程回收記憶體。通常系統會有許多background進程在運行,所以它們被保存在LRU列去確保最近被使用者看見的進程在最後殺掉。如果activity組件正確地執行生命週期而且保留目前狀態,殺掉進程對使用者經驗不會有明顯影響,因為當使用者導航回到activity組件時,activity組件會恢復所有可見狀態。
5.Empty process
這個進程沒有保有任何應用程式組件。保留這種進程的唯一原因是為了緩存的目的,以便改善下次組件需要在近程運行時的啟動時間。系統通常會殺掉這些進程來平衡整體系統資源進程暫存與核心暫存之間。

android盡可能將進程排序在最高階層,根據目前在進程中運行的組件的重要性。例如,如果進程主持一個service和visible組件,進程會被排序在visible process類別中,不是service process中。

此外,進程階層可能被提升,因為其他的進程要依賴它,一個服務其他進程的進程從不會排在比他服務的進程更低的階層。例如,如果在進程A的content provider服務在進程B中的客戶端,或如果在進程A的service被在進程B中的組件綁定,進程A總是被認為至少與進程B一樣重要。

沒有留言:

張貼留言