Android中的進程優先順序

來源:互聯網
上載者:User

標籤:android

一.概述

首先解釋一下什麼是進程: 
進程是一個具有獨立功能的程式關於某個資料集合的一次運行活動,是系統進行資源分派和調度的基本單位,進程包含多個線程在運行。

在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也是使用服務來處理耗時任務的,而不是簡單地把它放入線程中。


Android中的進程優先順序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.