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

Android系統(tǒng)會盡可能時間長的來維持一個程序的進(jìn)程,但當(dāng)系統(tǒng)資源緊張的時候,系統(tǒng)終究會為一些新的或者更重要的進(jìn)程殺死一些舊的進(jìn)程來釋放內(nèi)存淘捡。系統(tǒng)主要是根據(jù)進(jìn)程中組件的運行狀態(tài),來決定每一個進(jìn)程的重要性,從而決定哪個進(jìn)程需要殺死,哪個進(jìn)程需要保持羊瘩。最不重要的進(jìn)程最容易先被殺死,其次最不重要的進(jìn)程會被殺死,以此往復(fù),直到系統(tǒng)恢復(fù)了需要的資源怒医。

既然系統(tǒng)主要根據(jù)進(jìn)程的重要性來決定一個進(jìn)程的存亡,下面我們就將介紹根據(jù)重要性分類的五種不同進(jìn)程(重要性由高到低)昧碉。

1.foreground process,前臺進(jìn)程

所謂前臺進(jìn)程就是指用戶完成當(dāng)前工作而需要的進(jìn)程旗芬。判斷條件如下(滿足其一即可):

  • 進(jìn)程中的某個Activity正在與用戶進(jìn)行交互(Activity的onResume()方法被調(diào)用)
  • 綁定到與當(dāng)前用戶正在交互的activity的Service所在的進(jìn)程
  • 進(jìn)程中的某個Service正運行在前臺,即這個service的startForeground()方法被調(diào)用
  • 進(jìn)程中的某個Service正在執(zhí)行生命周期回調(diào)方法(比如,onCreate(),onStart(),或者onDeatroy())
  • 進(jìn)程中的BroadcastReceiver正在執(zhí)行onReceive()方法踱启。

一般來說的話,在某特定時刻,也僅會有為數(shù)不多的幾個前臺進(jìn)程俏讹。這些前臺進(jìn)程的重要性最高,當(dāng)系統(tǒng)內(nèi)存低到很低,以致不能繼續(xù)運行這些所有的進(jìn)程的話,系統(tǒng)將會殺死這些進(jìn)程弯菊。這種情況下,一般是指系統(tǒng)已經(jīng)到了一個極限邊緣了,所以為了讓UI繼續(xù)有反應(yīng)的話,系統(tǒng)不得不殺死一些前臺進(jìn)程纵势。

2.可視進(jìn)程-visible process

可視進(jìn)程是指沒有前臺運行的組件,但仍然會對用戶在屏幕看到的內(nèi)容造成影響的進(jìn)程。滿足下面條件的進(jìn)程都可以算作可視進(jìn)程:

  • 進(jìn)程運行的Activity不在前臺,但仍然是可見的(調(diào)用了onPause()方法)管钳。這種情況可能是這樣的,正在前臺運行的Activity啟動了一個對話框,這個對話框懸浮在這個activity之上,但仍有部分可見钦铁。
  • 進(jìn)程中的Service綁定到了一個可視(或前臺)的activity(該activity已調(diào)用了onPause()方法)。
    可視進(jìn)程也是有著極高重要性的進(jìn)程,只有在系統(tǒng)為了保持前臺進(jìn)程運行而不得不殺死可視進(jìn)程的時候,才會殺死可視進(jìn)程才漆。

3.服務(wù)進(jìn)程-service process

所謂的服務(wù)進(jìn)程,就是指除了上面兩種進(jìn)程外,如果一個進(jìn)程已經(jīng)通過startService()方法啟動了一個service的進(jìn)程牛曹。雖然這種service進(jìn)程跟用戶的看到的內(nèi)容不相關(guān),但它們所做的工作也是用戶關(guān)心的(比如在后臺播放音樂或者正在下載互聯(lián)網(wǎng)上的資源),系統(tǒng)會一直保持服務(wù)進(jìn)程,除非系統(tǒng)為了前臺進(jìn)程和可視進(jìn)程的運行,而不得不殺死服務(wù)進(jìn)程。

4.后臺進(jìn)程-background process

后臺進(jìn)程是指進(jìn)程中的activity當(dāng)前對用戶來說不可見(這個activity調(diào)用了onStop()方法)栽烂。后臺進(jìn)程不會對用戶的體驗造成任何影響,并且系統(tǒng)可以在前臺進(jìn)程躏仇、可視進(jìn)程恋脚、服務(wù)繼承需要內(nèi)存資源的時候會殺死后臺進(jìn)程。通常會有很多后臺進(jìn)程運行,并且這些后臺進(jìn)程保存在一個最近使用列表中,這樣做的好處就是保證用戶最近看到的進(jìn)程最后被殺死焰手。如果一個activity已經(jīng)正確的實現(xiàn)了生命周期方法,并且保存了當(dāng)前的狀態(tài),那么系統(tǒng)殺死這些后臺進(jìn)程對用戶的可視效果來說的話,沒有任何影響,因為當(dāng)用戶返回回來的時候,這個activity已經(jīng)保存了所有的可視狀態(tài)糟描。

5.空進(jìn)程-empty process

一個空進(jìn)程沒有任何運行的程序組件。系統(tǒng)保持空進(jìn)程存在的唯一原因就是為了緩存方面的考慮,這樣做主要是為了提高組件的啟動時間书妻。系統(tǒng)經(jīng)常會殺死這些空進(jìn)程來保持整個系統(tǒng)資源和內(nèi)核緩存之間的平衡船响。
Android根據(jù)進(jìn)程中運行的最重要的組件進(jìn)行劃分進(jìn)程的重要性,比如說,如果一個進(jìn)程中即有一個可視的activity,又有一個service,那么這個進(jìn)程應(yīng)該屬于可視進(jìn)程而不是服務(wù)進(jìn)程。

另外,一個進(jìn)程的重要性等級可能會因為依賴于該進(jìn)程的其他進(jìn)程而提高——一個服務(wù)于其他進(jìn)程的重要性不會低于被服務(wù)的進(jìn)程躲履。比如說,進(jìn)程A中的一個content provider正在為進(jìn)程B中的客戶服務(wù),或者進(jìn)程A中的一個service被綁定到了進(jìn)程B中的一個組件,那么進(jìn)程A的重要性至少會被認(rèn)為是和B的重要性是一樣的见间。
因為一個正在運行的服務(wù)所在的進(jìn)程的重要性高于一個處于后臺的activity所在的進(jìn)程,所以根據(jù)這一點,如果一個activity如果要執(zhí)行需要長時間運行的操作的話,這個activity最好為該操作啟動一個新的服務(wù),而不是僅僅創(chuàng)建一個工作線程,尤其是當(dāng)這個工作線程運行的時間可能比該activity的運行時間還長的時候。比如說,如果一個activity要往一個網(wǎng)站上上傳一張圖片的話,這個activity就應(yīng)該啟動一個服務(wù)來完成這個上傳操作,這要做的好處就是即使用戶離開了當(dāng)前的這個activity,上傳服務(wù)還會繼續(xù)進(jìn)行工猜。使用一個服務(wù)保證一個進(jìn)程至少還有服務(wù)進(jìn)程這個優(yōu)先級,而不用擔(dān)心activity會發(fā)生什么情況米诉。這也正是為什么廣播接收者應(yīng)該使用服務(wù)而不是把耗時的操作放在一個線程中的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篷帅,一起剝皮案震驚了整個濱河市史侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魏身,老刑警劉巖惊橱,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箭昵,居然都是意外死亡税朴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門家制,熙熙樓的掌柜王于貴愁眉苦臉地迎上來正林,“玉大人,你說我怎么就攤上這事颤殴∽壳簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵诅病,是天一觀的道長。 經(jīng)常有香客問我粥烁,道長贤笆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任讨阻,我火速辦了婚禮芥永,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝吮。我一直安慰自己埋涧,他們只是感情好板辽,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棘催,像睡著了一般劲弦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇坝,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天邑跪,我揣著相機(jī)與錄音,去河邊找鬼呼猪。 笑死画畅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宋距。 我是一名探鬼主播轴踱,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谚赎!你這毒婦竟也來了淫僻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤沸版,失蹤者是張志新(化名)和其女友劉穎嘁傀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體视粮,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡细办,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕾殴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑撞。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钓觉,靈堂內(nèi)的尸體忽然破棺而出茴肥,到底是詐尸還是另有隱情,我是刑警寧澤荡灾,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布瓤狐,位于F島的核電站,受9級特大地震影響批幌,放射性物質(zhì)發(fā)生泄漏础锐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一荧缘、第九天 我趴在偏房一處隱蔽的房頂上張望皆警。 院中可真熱鬧,春花似錦截粗、人聲如沸信姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽意推。三九已至豆瘫,卻和暖如春庄萎,著一層夾襖步出監(jiān)牢的瞬間傀顾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工螃征, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留俊性,地道東北人略步。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像定页,于是被迫代替她去往敵國和親趟薄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,870評論 25 707
  • 用兩張圖告訴你典徊,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料杭煎? 從這篇文章中你...
    hw1212閱讀 12,704評論 2 59
  • 【Android Service】 Service 簡介(★★★) 很多情況下,一些與用戶很少需要產(chǎn)生交互的應(yīng)用程...
    Rtia閱讀 3,143評論 1 21
  • 如何能讓我們的應(yīng)用能夠在系統(tǒng)后臺持續(xù)地運行是一個自Android從娘胎里出來時就議論不停的話題卒落,而且這似乎成了一個...
    駿駿的簡書閱讀 1,107評論 1 19
  • An是我的初中同學(xué)儡毕,初中時代我們坐前后桌也切,畢業(yè)后每年中秋節(jié)集體聚會一次。最近聯(lián)系變得頻繁起來腰湾,原因無它——向我取經(jīng)...
    早窗閱讀 257評論 0 2