您好,登錄后才能下訂單哦!
首先解釋一下什么是進程:
進程是一個具有獨立功能的程序關于某個數據集合的一次運行活動,是系統進行資源分配和調度的基本單位,進程包含多個線程在運行。
在Android中,默認情況下,同一個應用程序內的所有組件都是運行在同一個進程中的,大部分應用程序也不會去改變它。不過,如果需要指定某個特定組件所屬的進程,則可以利用manifest 文件來達到目的。
manifest文件中的每種組件元素——、 、 和——都支持定義android:process屬性,用于指定組件運行的進程。設置此屬性即可實現每個組件在各自的進程中運行,或者某幾個組件共享一個進程而其它組件運行于獨立的進程。設置此屬性也可以讓不同應用程序的組件運行在同一個進程中——實現多個應用程序共享同一個Linux用戶ID、賦予同樣的權限。
元素也支持android:process屬性,用于指定所有組件的默認進程。
如果內存不足,可又有其它為用戶提供更緊急服務的進程需要更多內存,Android可能會決定關閉一個進程。在此進程中運行著的應用程序組件也會因此被銷毀。當需要再次工作時,會為這些組件重新創建一個進程。
在決定關閉哪個進程的時候,Android系統會權衡它們相對用戶的重要程度。比如,相對于一個擁有可見activity的進程,更有可能去關閉一個activity已經在屏幕上看不見的進程。也就是說,是否終止一個進程,取決于運行在此進程中組件的狀態
Android系統試圖盡可能長時間地保持應用程序進程,但為了新建或者運行更加重要的進程,總是需要清除過時進程來回收內存。為了決定保留或終止哪個進程,根據進程內運行的組件及這些組件的狀態,系統把每個進程都劃入一個“重要性層次結構”中。重要性最低的進程首先會被清除,然后是下一個最低的,依此類推,這都是恢復系統資源所必需的。
重要性層次結構共有5級,以下列表按照重要程度列出了各類進程(第一類進程是最重要的,將最后一個被終止):
1.前臺進程
用戶當前操作所必須的進程。滿足以下任一條件時,進程被視作處于前臺:
其中運行著正與用戶交互的Activity(Activity對象的onResume()]方法已被調用)。
其中運行著被正與用戶交互的activity綁定的服務。
其中運行著“前臺”服務——服務以[startForeground()方式被調用。
其中運行著正在執行生命周期回調方法(onCreate()、onStart()或onDestroy())的服務。
其中運行著正在執行onReceive()方法的BroadcastReceiver。
一般而言,任何時刻前臺進程都是為數不多的,只有迫不得已——當內存不足以維持它們同時運行時——才會被終止。通常,設備這時候已經到了使用虛擬內存的地步,終止一些前臺進程是為了保證用戶界面的及時響應。
2.可見進程
沒有前臺組件、但仍會影響用戶在屏幕上所見內容的進程。滿足以下任一條件時,進程被認為是可見的:
其中運行著不在前臺的Activity,但用戶仍然可見到此
activity(onPause()方法被調用了)。比如以下場合就可能發生這種情況:前臺activity打開了一個對話框,而之前的activity還允許顯示在后面。
其中運行著被可見(或前臺)activity綁定的服務。
可見進程被認為是非常重要的進程,除非無法維持所有前臺進程同時運行了,它們是不會被終止的。
3.服務進程
此進程運行著由startService()方法啟動的服務,它不會升級為上述兩級別。盡管服務進程不直接和用戶所見內容關聯,但他們通常在執行一些用戶關心的操作(比如在后臺播放音樂或從網絡下載數據)。因此,除非內存不足以維持所有前臺、可見進程同時運行,系統會保持服務進程的運行。
4.. 后臺進程
包含目前用戶不可見activity(Activity對象的onStop()方法已被調用)的進程。這些進程對用戶體驗沒有直接的影響,系統可能在任意時間終止它們,以回收內存供前臺進程、可見進程及服務進程使用。通常會有很多后臺進程在運行,所以它們被保存在一個LRU(最近最少使用)列表中,以確保最近被用戶使用的activity最后一個被終止。如果一個activity正確實現了生命周期方法,并保存了當前的狀態,則終止此類進程不會對用戶體驗產生可見的影響。因為在用戶返回時,activity會恢復所有可見的狀態。關于保存和恢復狀態的詳細信息,請參閱Activity文檔。
5..空進程
不含任何活動應用程序組件的進程。保留這種進程的唯一目的就是用作緩存,以改善下次在此進程中運行組件的啟動時間。為了在進程緩存和內核緩存間平衡系統整體資源,系統經常會終止這種進程。
依據進程中目前活躍組件的重要程度,Android會給進程評估一個盡可能高的級別。例如:如果一個進程中運行著一個服務和一個用戶可見的activity,則此進程會被評定為可見進程,而不是服務進程。
此外,一個進程的級別可能會由于其它進程的依賴而被提高——為其它進程提供服務的進程級別永遠不會低于使用此服務的進程。比如:如果A進程中的content provider為進程B中的客戶端提供服務,或進程A中的服務被進程B中的組件所調用,則A進程至少被視為與進程B同樣重要。
因為運行服務的進程級別是高于后臺activity進程的,所以,如果activity需要啟動一個長時間運行的操作,則為其啟動一個服務會比簡單地創建一個工作線程更好些——尤其是該操作時間比activity的生存期還要長的情況下。比如,一個activity要把圖片上傳至Web網站,就應該創建一個服務來執行之,即使用戶離開了此activity,上傳還是會在后臺繼續運行。不論activity發生什么情況,使用服務可以保證操作至少擁有“服務進程”的優先級。同理,廣播接收器broadcast receiver也是使用服務來處理耗時任務的,而不是簡單地把它放入線程中。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。