當啟動一個應用程序組件時,如果該應用沒有正在運行的其它程序組件,那么Android系統將為這個應用創建一個新進程(包含一個線程)用于運行應用。缺省情況下,一個應用的所有組件(Activity,Service等)運行在同一個進程和線程中(稱為“主”線程)。如果在啟動一個應用程序組件時,這個應用已經有進程在運行(因為有應用的其它組件存在),那么這個應用程序組件將使用同一進程和線程運行。當然你可以使用不同進程來運行不同的組件,或者在進程中創建新的線程。
進程
缺省情況,應用的所有組件都運行在同一個進程,而且應用不應該改變這個傳統。然而,如果你發現你需要控制某個組件運行在那個進程中,你可以通過應用程序清單來配置。
在應用程序清單文件中,每個類型的應用程序組件-,,和都支持 android:process 屬性,這個屬性用來指明該程序組件運行的進程。你可以為應用程序組件設置這個屬性以使每個組件運行在不同的進程中或者某幾個組件使用同一進程。你也可以通過設置android:process 使得不同應用中的組件運行在同一個進程中-前提是這些應用使用同一個Linux用戶名并且使用同一個證書簽名。
元素也支持 android: process 屬性,用來為應用程序的所有組件設置缺省的進程。
Android系統中系統資源過低而且有需要為用戶立即提供服務的進程需要啟動時可能會終止某些進程的運行。運行在這些被終止的進程中的程序組件將逐個被銷毀。此后如果還有工作需要這些應用程序組件時將啟動新的進程。
系統中決定哪些進程可以殺死時,系統將權衡這些進程對用戶的重要性。比如,對于那些運行不可見的Activity的進程比運行屏幕上可見的Activity的進程更容易被殺死。
進程生命周期
Android系統會盡可能長的保持應用程序進程的運行,但總會有需要清除舊的進程來釋放資源以滿足新或是重要的進程的運行。為了決定哪些進程可以殺死,哪些進程需要保留,系統根據運行在其中的應用程序組件和這些組件的狀態,將這些進程分配到“重要性層次表”中。具有最低重要性的進程首先被殺死,次重要性的進程為其次等等直到系統恢復所需的資源。
“重要性層次表”可以分為五個層次,下面列表給出了不同類型的進程的重要性等級(最重要的排在前面):
1.前臺進程
這種進程是當前用戶所需要的。一個進程被認為是前臺進程需滿足下面條件之一:
· 本進程中有Activity是當前和用戶有交互的Activity(該Activity的onResume()已調用)。
· 本進程中有Service和當前用戶有交互Activity的綁定。
· 本進程中有在前臺運行的Service—該Service調用過startForeground()。
· 本進程中有Service正在執行某個生命周期回調函數(onCreate(),onStart()或onDestroy())。
· 本進程中的某個BroadcastReceiver正在執行onReceive()方法。
2.可見進程
這種進程雖然不含有任何在前臺運行的組件,但會影響當前顯示給用戶屏幕上的內容,一個進程中滿足下面兩個條件之一時被認為是個可見進程:
· 本進程含有一個雖然不在前臺但卻部分可見的Activity(該Activity的onPause()被調用)??赡馨l生的情形是前臺Activity顯示一對話框,此時之前的Activity變為部分可見。
· 本進程含有綁定到可見Activity的Service。
3. 服務進程
該進程運行了某個使用startService()啟動的Service,但不屬于以上兩種情況。盡管此服務進程不直接和用戶可以看到的任何部分有關聯,但它會運行一些用戶關心的事情(比如在后臺播放音樂或者通過網絡下載文件)。因此Android系統會盡量讓它們運行直到系統資源低到無法滿足前臺和可見進程的運行。
4.后臺進程
該進程運行一些目前用戶不可見的Activity(該Activity的onStop()已被調用),該進程對用戶體驗無直接的影響,系統中資源低時為保證前臺,可見或服務進程運行時可以隨時殺死該進程。通常系統中有很多進程在后臺運行,這些進程保存在LRU(最近使用過)列表中以保證用戶最后看到的進程最后被殺死。如果一個Activity正確實現了它的生命周期函數,并保存了它的狀態。殺死運行該Activity的進程對用戶來說在視覺上不會有什么影響,這是因為之后用戶回到該Activity時,該Activity能夠正確恢復之前屏幕上的狀態。
5.空進程
該進程不運行任何活動的應用程序組件。保持這種進程運行的唯一原因是由于緩存,以縮短下次運行某個程序組件時的啟動時間。系統會為了進程緩存和內核緩存之間的平衡經常會清除空進程。
Android系統會根據進程中當前活動的程序組件的重要性,近可能高的給該進程評級。比如,如果一個進程中同時有一個Service和一個可見的Activity在運行,該進程將被定級為可見進程而不是服務進程(可見進程的優先級高于服務進程)。
此外,一個進程的級別可能有對其有依賴的其它進程提升—一個給其它進程提供服務的進程的級別不會低于它所服務的進程的級別。比如,進程A中的Content Provider 給進程B中某客戶端提供數據服務或者進程A中某個服務被進程B某組件所綁定。那么進程A重要性程度不會低于進程B。
由于運行Service的進程的級別高于運行后臺Activity的進程的級別,一個需要較長時間運行操作的Activity 啟動能夠完成該操作的Service可能也能很好的完成任務而無需簡單創建一個新工作線程—尤其是該操作運行時間比該Activity還要長。比如,如果一個Activity需要完成向服務器上傳圖片任務時應該使用一個服務來完成上載任務,這些即使用戶離開該Activity,Service依然可以在后臺完成上載任務。使用Service可以保證某個操作至少具有“服務進程”的優先級而無需關心該Activity發生了什么變化。這也是一個Broadcast Receiver應該使用一個Service而非一線程來完成某個耗時的任務。
線程
Android系統啟動某個應用后,將會創建一個線程來運行該應用,這個線程成為“主”線程。主線程非常重要,這是因為它要負責消息的分發,給界面上相應的UI組件分發事件,包括繪圖事件。這也是應用可以和UI組件(為android.widget和android.view中定義的組件)發生直接交互的線程。因此主線程也通常稱為用戶界面線程(UI線程)。
原文轉自:http://blog.csdn.net/mapdigit/article/details/8711799