Android 進(jìn)程優(yōu)先級和 LowMemoryKiller 機(jī)制 - 1

一 進(jìn)程生命周期

Android 系統(tǒng)會盡量長時間地保持應(yīng)用進(jìn)程仇祭,用戶應(yīng)用退出后醋奠,如果沒有主動把進(jìn)程 kill 掉贱纠,該進(jìn)程還會在系統(tǒng)中緩存莫换,這樣用戶再次啟動 App 時霞玄,會加速啟動。隨著打開的應(yīng)用越來越多拉岁,系統(tǒng)內(nèi)存會變得不足(Out of Memory)坷剧,為了新建進(jìn)程或運(yùn)行更重要的進(jìn)程,最終需要移除舊進(jìn)程來回收內(nèi)存喊暖。 為了確定保留或終止哪些進(jìn)程惫企,系統(tǒng)會根據(jù)進(jìn)程中正在運(yùn)行的組件以及這些組件的狀態(tài),將每個進(jìn)程放入“重要性層次結(jié)構(gòu)”中陵叽。 必要時狞尔,系統(tǒng)會首先消除重要性最低的進(jìn)程,然后是重要性略遜的進(jìn)程巩掺,依此類推偏序,以回收系統(tǒng)資源。LowMemoryKiller 機(jī)制就是系統(tǒng)用于判定是否需要?dú)⑦M(jìn)程和殺哪些進(jìn)程的一個機(jī)制胖替。

系統(tǒng)內(nèi)進(jìn)程優(yōu)先級分 5 級研儒。

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

    用戶當(dāng)前操作所必需的進(jìn)程豫缨。如果一個進(jìn)程滿足以下任一條件,即視為前臺進(jìn)程:

    • 包含用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
    • 包含某個 Service端朵,后者綁定到用戶正在交互的 Activity
    • 包含正在“前臺”運(yùn)行的 Service(已調(diào)用 startForeground())
    • 包含正執(zhí)行一個生命周期回調(diào)的 Service(onCreate()好芭、onStart() 或 onDestroy())
    • 包含正執(zhí)行其 onReceive() 方法的 BroadcastReceiver
  2. 可見進(jìn)程(Visible process)

    沒有任何前臺組件、但仍會影響用戶在屏幕上所見內(nèi)容的進(jìn)程冲呢。 如果一個進(jìn)程滿足以下任一條件栓撞,即視為可見進(jìn)程:

    • 托管不在前臺、但仍對用戶可見的 Activity(已調(diào)用 onPause() 方法)碗硬。例如,如果前臺 Activity 啟動了一個對話框瓢颅,允許在其后顯示上一 Activity恩尾,則有可能會發(fā)生這種情況。
    • 托管綁定到可見(或前臺)Activity 的 Service挽懦。

    可見進(jìn)程被視為是極其重要的進(jìn)程翰意,除非為了維持所有前臺進(jìn)程同時運(yùn)行而必須終止,否則系統(tǒng)不會終止這些進(jìn)程信柿。

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

    正在運(yùn)行已使用 startService() 方法啟動的服務(wù)且不屬于上述兩個更高類別進(jìn)程的進(jìn)程冀偶。盡管服務(wù)進(jìn)程與用戶所見內(nèi)容沒有直接關(guān)聯(lián),但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如渔嚷,在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))进鸠。因此,除非內(nèi)存不足以維持所有前臺進(jìn)程和可見進(jìn)程同時運(yùn)行形病,否則系統(tǒng)會讓服務(wù)進(jìn)程保持運(yùn)行狀態(tài)客年。

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

    包含目前對用戶不可見的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop() 方法)。這些進(jìn)程對用戶體驗沒有直接影響漠吻,系統(tǒng)可能隨時終止它們量瓜,以回收內(nèi)存供前臺進(jìn)程、可見進(jìn)程或服務(wù)進(jìn)程使用途乃。 通常會有很多后臺進(jìn)程在運(yùn)行绍傲,因此它們會保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進(jìn)程最后一個被終止耍共。如果某個 Activity 正確實現(xiàn)了生命周期方法烫饼,并保存了其當(dāng)前狀態(tài),則終止其進(jìn)程不會對用戶體驗產(chǎn)生明顯影響划提,因為當(dāng)用戶導(dǎo)航回該 Activity 時枫弟,Activity 會恢復(fù)其所有可見狀態(tài)。有關(guān)保存和恢復(fù)狀態(tài)的信息鹏往,請參閱 Activity文檔淡诗。

  5. 空進(jìn)程 (Empty process)

    不含任何活動應(yīng)用組件的進(jìn)程骇塘。保留這種進(jìn)程的的唯一目的是用作緩存,以縮短下次在其中運(yùn)行組件所需的啟動時間韩容。 為使總體系統(tǒng)資源在進(jìn)程緩存和底層內(nèi)核緩存之間保持平衡款违,系統(tǒng)往往會終止這些進(jìn)程。

關(guān)于進(jìn)程優(yōu)先級需要注意的內(nèi)容:

  • 根據(jù)進(jìn)程中當(dāng)前活動組件的重要程度群凶,Android 會將進(jìn)程評定為它可能達(dá)到的最高級別插爹。例如,如果某進(jìn)程托管著服務(wù)和可見 Activity请梢,則會將此進(jìn)程評定為可見進(jìn)程赠尾,而不是服務(wù)進(jìn)程。

  • 此外毅弧,一個進(jìn)程的級別可能會因其他進(jìn)程對它的依賴而有所提高气嫁,即服務(wù)于另一進(jìn)程的進(jìn)程其級別永遠(yuǎn)不會低于其所服務(wù)的進(jìn)程。 例如够坐,如果進(jìn)程 A 中的內(nèi)容提供程序為進(jìn)程 B 中的客戶端提供服務(wù)寸宵,或者如果進(jìn)程 A 中的服務(wù)綁定到進(jìn)程 B 中的組件,則進(jìn)程 A 始終被視為至少與進(jìn)程 B 同樣重要元咙。

  • 由于運(yùn)行服務(wù)的進(jìn)程其級別高于托管后臺 Activity 的進(jìn)程梯影,因此啟動長時間運(yùn)行操作的 Activity 最好為該操作啟動服務(wù),而不是簡單地創(chuàng)建工作線程庶香,當(dāng)操作有可能比 Activity 更加持久時尤要如此甲棍。例如,正在將圖片上傳到網(wǎng)站的 Activity 應(yīng)該啟動服務(wù)來執(zhí)行上傳脉课,這樣一來救军,即使用戶退出 Activity,仍可在后臺繼續(xù)執(zhí)行上傳操作倘零。使用服務(wù)可以保證唱遭,無論 Activity 發(fā)生什么情況,該操作至少具備“服務(wù)進(jìn)程”優(yōu)先級呈驶。 同理拷泽,廣播接收器也應(yīng)使用服務(wù),而不是簡單地將耗時冗長的操作放入線程中袖瞻。

NEXT: http://www.reibang.com/p/cd6510aa9150

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末司致,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聋迎,更是在濱河造成了極大的恐慌脂矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霉晕,死亡現(xiàn)場離奇詭異庭再,居然都是意外死亡捞奕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門拄轻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅围,“玉大人,你說我怎么就攤上這事恨搓≡捍伲” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵斧抱,是天一觀的道長常拓。 經(jīng)常有香客問我,道長辉浦,這世上最難降的妖魔是什么墩邀? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮盏浙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荔茬。我一直安慰自己废膘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布慕蔚。 她就那樣靜靜地躺著丐黄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孔飒。 梳的紋絲不亂的頭發(fā)上灌闺,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音坏瞄,去河邊找鬼桂对。 笑死,一個胖子當(dāng)著我的面吹牛鸠匀,可吹牛的內(nèi)容都是我干的蕉斜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼缀棍,長吁一口氣:“原來是場噩夢啊……” “哼宅此!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爬范,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤父腕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后青瀑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧亮,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萧诫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杜顺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财搁。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躬络,靈堂內(nèi)的尸體忽然破棺而出尖奔,到底是詐尸還是另有隱情,我是刑警寧澤穷当,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布提茁,位于F島的核電站,受9級特大地震影響馁菜,放射性物質(zhì)發(fā)生泄漏茴扁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一汪疮、第九天 我趴在偏房一處隱蔽的房頂上張望峭火。 院中可真熱鬧,春花似錦智嚷、人聲如沸卖丸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稍浆。三九已至,卻和暖如春猜嘱,著一層夾襖步出監(jiān)牢的瞬間衅枫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工朗伶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弦撩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓论皆,卻偏偏與公主長得像孤钦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纯丸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,334評論 25 707
  • 前言:本文所寫的是博主的個人見解偏形,如有錯誤或者不恰當(dāng)之處,歡迎私信博主觉鼻,加以改正俊扭!原文鏈接,demo鏈接 當(dāng)某個應(yīng)...
    PassersHowe閱讀 534評論 0 1
  • 愛情的世界里坠陈,或許萨惑,每個人都期望遇見一個「待你如初捐康,疼你入骨」的人。 但是庸蔼,通常待你如初的人鳳毛麟角解总,傷的你遍體鱗...
    南城花未開1314閱讀 299評論 0 0
  • CSS是一種叫做樣式表(stylesheet)的技術(shù)。也有的人稱之為層疊樣式表(Cascading Stylesh...
    _Lily閱讀 148評論 0 1
  • 這個世界除了清晰,更多的是模糊. 抬頭看天空,到處都是重影,本該有足跡的云兒,連成一片,讓你無從分辨.遠(yuǎn)處的建筑零...
    欺塵閱讀 627評論 0 1