Android的進程與線程(2)按重要性劃分等級的5種進程

來源:互聯網
上載者:User

Android系統會儘可能時間長的來維持一個程式的進程,但當系統資源緊張的時候,系統終究會為一些新的或者更重要的進程殺死一些舊的進程來釋放記憶體。系統主要是根據進程中組件的運行狀態,來決定每一個進程的重要性,從而決定哪個進程需要殺死,哪個進程需要保持。最不重要的進程最容易先被殺死,其次最不重要的進程會被殺死,以此往複,直到系統復原了需要的資源。
既然系統主要根據進程的重要性來決定一個進程的存亡,下面我們就將介紹根據重要性分類的五種不同進程(重要性由高到低)。
1.foreground process,前台進程
所謂前台進程就是指使用者完成當前工作而需要的進程。判斷條件如下(滿足其一即可):
-進程中的某個Activity正在與使用者進行互動(Activity的onResume()方法被調用)
-綁定到與目前使用者正在互動的activity的Service所在的進程
-進程中的某個Service正運行在前台,即這個service的startForeground()方法被調用
-進程中的某個Service正在執行生命週期回調方法(比如,onCreate(),onStart(),或者onDeatroy())
-進程中的BroadcastReceiver正在執行onReceive()方法。
一般來說的話,在某特定時刻,也僅會有為數不多的幾個前台進程。這些前台進程的重要性最高,當系統記憶體低到很低,以致不能繼續運行這些所有的進程的話,系統將會殺死這些進程。這種情況下,一般是指系統已經到了一個極限邊緣了,所以為了讓UI繼續有反應的話,系統不得不殺死一些前台進程。
2.可視進程-visible process
可視進程是指沒有前台啟動並執行組件,但仍然會對使用者在螢幕看到的內容造成影響的進程。滿足下麵條件的進程都可以算作可視進程:
-進程啟動並執行Activity不在前台,但仍然是可見的(調用了onPause()方法)。這種情況可能是這樣的,正在前台啟動並執行Activity啟動了一個對話方塊,這個對話方塊懸浮在這個activity之上,但仍有部分可見。
-進程中的Service綁定到了一個可視(或前台)的activity(該activity已調用了onPause()方法)。
可視進程也是有著極高重要性的進程,只有在系統為了保持前台進程運行而不得不殺死可視進程的時候,才會殺死可視進程。
3.服務進程-service process
所謂的服務進程,就是指除了上面兩種進程外,如果一個進程已經通過startService()方法啟動了一個service的進程。雖然這種service進程跟使用者的看到的內容不相關,但它們所做的工作也是使用者關心的(比如在背景播放音樂或者正在下載互連網上的資源),系統會一直保持服務進程,除非系統為了前台進程和可視進程的運行,而不得不殺死服務進程。
4.後台進程-background process
後台進程是指進程中的activity當前對使用者來說不可見(這個activity調用了onStop()方法)。後台進程不會對使用者的體驗造成任何影響,並且系統可以在前台進程、可視進程、服務繼承需要記憶體資源的時候會殺死後台進程。通常會有很多後台進程運行,並且這些後台進程儲存在一個最近使用列表中,這樣做的好處就是保證使用者最近看到的進程最後被殺死。如果一個activity已經正確的實現了生命週期方法,並且儲存了當前的狀態,那麼系統殺死這些後台進程對使用者的可視效果來說的話,沒有任何影響,因為當使用者返回回來的時候,這個activity已經儲存了所有的可視狀態。
5.空進程-empty process
一個空進程沒有任何啟動並執行程式組件。系統保持空進程存在的唯一原因就是為了緩衝方面的考慮,這樣做主要是為了提高組件的啟動時間。系統經常會殺死這些空進程來保持整個系統資源和核心緩衝之間的平衡。
Android根據進程中啟動並執行最重要的組件進行劃分進程的重要性,比如說,如果一個進程中即有一個可視的activity,又有一個service,那麼這個進程應該屬於可視進程而不是服務進程。
另外,一個進程的重要性等級可能會因為依賴於該進程的其他進程而提高——一個服務於其他進程的重要性不會低於被服務的進程。比如說,進程A中的一個content provider正在為進程B中的客戶服務,或者進程A中的一個service被綁定到了進程B中的一個組件,那麼進程A的重要性至少會被認為是和B的重要性是一樣的。
因為一個正在啟動並執行服務所在的進程的重要性高於一個處於背景activity所在的進程,所以根據這一點,如果一個activity如果要執行需要長時間啟動並執行操作的話,這個activity最好為該操作啟動一個新的服務,而不是僅僅建立一個背景工作執行緒,尤其是當這個背景工作執行緒啟動並執行時間可能比該activity的已耗用時間還長的時候。比如說,如果一個activity要往一個網站上上傳一張圖片的話,這個activity就應該啟動一個服務來完成這個上傳操作,這要做的好處就是即使使用者離開了當前的這個activity,上傳服務還會繼續進行。使用一個服務保證一個進程至少還有服務進程這個優先順序,而不用擔心activity會發生什麼情況。這也正是為什麼廣播接收者應該使用服務而不是把耗時的操作放在一個線程中的原因。
參考文檔:http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

下一篇將繼續介紹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.