首先我們看一下 Android 應用程序的生命周期圖:
在大部份情況下,每個
Android
應用都將運行在自己的
Linux
進程當中。當這個應用的某些代碼需要執行時,進程就會被創建,并且將保持運行,直到該進程不再需要,而系統需要釋放它所占用的內存,為其他應用所用時,才停止。
Android
一個重要并且特殊的特性就是,一個應用的進程的生命周期不是由應用自身直接控制的,而是由系統,根據運行中的應用的一些特征來決定的,包括:這些應用對用戶的重要性、系統的全部可用內存。
對于應用開發者來說,理解不同的應用組件(特別是
Activity
、
Service
、
Intent Receiver
)對應用進程的生命周期的影響,這是非常重要的。如果沒有正確地使用這些組件,將會導致當應用正在處理重要的工作時,進程卻被系統消毀的后果。
對于進程生命周期,一個普遍的錯誤就是:當一個
Intent Receiver
在它的
onReceiveIntent()
方法中,接收到一個
intent
后,就會從這個方法中返回。而一旦從這個方法返回后,系統將會認為這個
Intent Receiver
不再處于活動狀態了,也就會認為它的宿主進程不需要了(除非宿主進程中還存在其它的應用組件)。從而,系統隨時都會消毀這個進程,收回內存,并中止其中還在運行的子線程。問題的解決辦法就是,在
IntentReceiver
中,啟動一個
Service
,這樣系統就會知道在這個進程中,還有活動的工作正在執行。
為了決定在內存不足情況下消毀哪個進程,
Android
會根據這些進程內運行的組件及這些組件的狀態,把這些進程劃分出一個“重要性層次”。這個層次按順序如下:
1、
前端進程
是擁有一個顯示在屏幕最前端并與使用者做交互的
Activity
(它的
onResume
已被調用)的進程,也可能是一個擁有正在運行的
IntentReceiver
(它的
onReceiveIntent
()方法正在運行)的進程。在系統中,這種進程是很少的,只有當內存低到不足于支持這些進程的繼續運行,才會將這些進程消毀。通常這時候,設備已經達到了需要進行內存整理的狀態,為了保障用戶界面不停止響應,只能消毀這些進程;
2、
可視進程
是擁有一個用戶在屏幕上可見的,但并沒有在前端顯示的
Activity
(它的
onPause
已被調用)的進程。例如:一個以對話框顯示的前端
activity
在屏幕上顯示,而它后面的上一級
activity
仍然是可見的。這樣的進程是非常重要的,一般不會被消毀,除非為了保障所有的前端進程正常運行,才會被消毀。
3、
服務進程
是擁有一個由
startService
()方法啟動的
Service
的進程。盡管這些進程對于使用者是不可見的,但他們做的通常是使用者所關注的事情(如后臺
MP3
播放器或后臺上傳下載數據的網絡服務)。因此,除非為了保障前端進程和可視進程的正常運行,系統才會消毀這種進程。
4、
后臺進程
是擁有一個用戶不可見的
Activity
(
onStop
()方法已經被調用)的進程。這些進程不直接影響用戶的體驗。如果這些進程正確地完成了自己的生命周期(詳細參考
Activity
類),系統會為了以上三種類型進程,而隨時消毀這種進程以釋放內存。通常會有很多這樣的進程在運行著,因些這些進程會被保存在一個LRU列表中,以保證在內存不足時,用戶最后看到的進程將在最后才被消毀。
5、
空進程
是那些不擁有任何活動的應用組件的進程。保留這些進程的唯一理由是,做為一個緩存,在它所屬的應用的組件下一次需要時,縮短啟動的時間。同樣的,為了在這些緩存的空進程和底層的核心緩存之間平衡系統資源,系統會經常消毀這些空進程。
當要對一個進程進行分類時,系統會選擇在這個進程中所有活動的組件中重要等級最高的那個做為依據。可以參考 Activity 、 Service 、 IntentReceiver 文檔,了解這些組件如何影響進程整個生命周期的更多細節。這些類的文檔都對他們如何影響他們所屬的應用的整個生命周期,做了詳細的描述。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
