Android 中進(jìn)程的級(jí)別以及 Service 的優(yōu)先級(jí)

Android 中進(jìn)程的級(jí)別以及 Service 的優(yōu)先級(jí)

由于在 bindService 啟動(dòng) service 的時(shí)候需要傳入 flag (可以看一下這篇文章)Service 瓤的,這里有介紹 flag 的作用遥椿,和啟動(dòng)的 Service 的優(yōu)先級(jí)有關(guān)系蜜暑,一般傳入:BIND_AOUT_CREATE络拌,這里我們需要了解一下 Android 中進(jìn)程的優(yōu)先級(jí)的情況。

進(jìn)程的五個(gè)常用級(jí)別:

  • 前臺(tái)進(jìn)程(Foreground process):前臺(tái)進(jìn)程就是用戶當(dāng)前要處理的所有事情都必須要使用的進(jìn)程监嗜。滿足下面的各種情況則認(rèn)為是前臺(tái)進(jìn)程吊输。

    • 進(jìn)程持有一個(gè)正在和用戶交互的 Activity声畏。
    • 進(jìn)程持有一個(gè) Service啄栓,這個(gè) Service 處于這幾種狀態(tài):1. Service 與用戶正在交互的 Activity 綁定娄帖。 2. Service 是在前臺(tái)運(yùn)行的。 3. Service 正在執(zhí)行它的生命周期 onCreate() onStrarCommand昙楚,onDestroy近速。 4. 進(jìn)程持有一個(gè) BroadcastReceiver 這個(gè) BroadcastReceiver 正在執(zhí)行它的 onReceiver 方法。

    殺死前臺(tái)進(jìn)程需要用戶交互堪旧,前臺(tái)進(jìn)程的優(yōu)先級(jí)最高

  • 可見(jiàn)進(jìn)程(Visible process):如果一個(gè)進(jìn)程不含任何前臺(tái)的組件削葱,但仍可被用戶在屏幕上看到。當(dāng)滿足下面任意一條的時(shí)候淳梦,進(jìn)程被認(rèn)為是可見(jiàn)的析砸。

    • 進(jìn)程持有一個(gè) activity,這個(gè) activity 不在前臺(tái)爆袍。但是仍然可見(jiàn)的情況首繁。
    • 進(jìn)程持有一個(gè) Service 作郭,這個(gè) Service 與一個(gè)可見(jiàn)的 Activity 綁定。

    可見(jiàn)的進(jìn)程也被認(rèn)為很重要蛮瞄,一般不會(huì)被銷毀所坯,除非是為了保證所有前臺(tái)進(jìn)程的運(yùn)行而不得已不殺死可見(jiàn)進(jìn)程的時(shí)候

  • 服務(wù)進(jìn)程(Service process):如果一個(gè)進(jìn)程中運(yùn)行著一個(gè) Service谆扎,這個(gè) Service 是通過(guò) startService() 開(kāi)啟的挂捅,并且不屬于上面兩種較高優(yōu)先級(jí)的情況下,這個(gè)進(jìn)程就是一個(gè)服務(wù)進(jìn)程堂湖。盡管服務(wù)進(jìn)程沒(méi)有和用戶可以看到的東西綁定闲先,但是它們一般在做的事情是用戶關(guān)心的,比如后臺(tái)播放音樂(lè)无蜂,后臺(tái)下載數(shù)據(jù)等伺糠。所以系統(tǒng)會(huì)盡量維持它們的運(yùn)行,除非系統(tǒng)內(nèi)存不足以維持前臺(tái)進(jìn)程和可見(jiàn)進(jìn)程的運(yùn)行需要(這句話和沒(méi)說(shuō)一樣)

  • 后臺(tái)進(jìn)程(Background process):如果進(jìn)程不屬于上面三種情況斥季,但是進(jìn)程持有一個(gè)用戶不可見(jiàn)的 activity (activity 的 onStop 被調(diào)用训桶,但是 onDestroy 沒(méi)有被調(diào)用的狀態(tài))就認(rèn)為進(jìn)程是一個(gè)后臺(tái)進(jìn)程。

    后臺(tái)進(jìn)程不直接影響用戶體驗(yàn)酣倾,系統(tǒng)會(huì)為了前臺(tái)進(jìn)程舵揭、可見(jiàn)進(jìn)程、服務(wù)進(jìn)程而任意殺死后臺(tái)進(jìn)程躁锡,通常情況下會(huì)有很多后臺(tái)進(jìn)程存在午绳,他們會(huì)被保存在一個(gè) LRU(least recently used)列表中,這樣就可以確保用戶最近使用的 Activity 最后被銷毀映之,先銷毀時(shí)間最遠(yuǎn)的 Activity拦焚。

  • 空進(jìn)程:如果一個(gè)進(jìn)程不包含任何活躍的應(yīng)用組件,則認(rèn)為是空進(jìn)程杠输。例如:一個(gè)進(jìn)程當(dāng)中已經(jīng)沒(méi)有數(shù)據(jù)運(yùn)行了赎败,但是內(nèi)存當(dāng)中還為這個(gè)應(yīng)用保留了一個(gè)進(jìn)程空間。保存這種進(jìn)程的唯一理由是為了緩存的需要蠢甲,為了加快下次啟動(dòng)這個(gè)進(jìn)程中組件的啟動(dòng)時(shí)間螟够,這種空進(jìn)程經(jīng)常被殺死。

總結(jié): 我們已經(jīng)知道有這 5 個(gè)進(jìn)程了峡钓,并且他們的優(yōu)先級(jí)都列出來(lái)的妓笙,這樣我們就可以根據(jù)優(yōu)先級(jí)來(lái)讓我們的 APP 盡量不被殺死了。

下面再來(lái)說(shuō)一下 BindService() 方法中的 flag 參數(shù):

  • BIND_AUOT_CREATE:

    只要綁定存在就會(huì)自動(dòng)創(chuàng)建這個(gè) Service能岩,雖然創(chuàng)建了 Service寞宫,但是它的 onStartCommand 方法是不會(huì)調(diào)用的,因?yàn)檫@個(gè)方法只有在 startService 的時(shí)候被調(diào)用拉鹃。

    在 Android 4.0 以前辈赋,不提供這個(gè)標(biāo)志的話鲫忍,會(huì)影響系統(tǒng)判定當(dāng)前 Service 進(jìn)程的重要性(會(huì)把它認(rèn)為是后臺(tái)進(jìn)程),當(dāng)要設(shè)置的時(shí)候钥屈,告訴系統(tǒng)進(jìn)程重要性的唯一方式是悟民,通過(guò) bindService 來(lái)實(shí)現(xiàn),在這種情況下篷就,只有 Activity 在前臺(tái)才會(huì)起作用射亏。(這樣 Service 進(jìn)程的優(yōu)先級(jí)等同于啟動(dòng)它的進(jìn)程的優(yōu)先級(jí))。

    現(xiàn)在要想把 Service 進(jìn)程的優(yōu)先級(jí)降低竭业,必須提供新的 falg (BIND_ADJUST_WITH_ACTIVITY)智润。考慮到兼容性未辆,如果沒(méi)有指定 BIND_AUTO_CREATE 的時(shí)候窟绷,系統(tǒng)會(huì)自動(dòng)加上 BIND_WAIVE_PRIORITY 和 BIND_ADJUST_WITH_ACTIVITY 來(lái)實(shí)現(xiàn)降低優(yōu)先級(jí)的效果。因?yàn)樵?Android 4.0 以前 Service 的優(yōu)先級(jí)默認(rèn)是后臺(tái)進(jìn)程咐柜,在 Android 4.0 之后默認(rèn)是等同于宿主進(jìn)程兼蜈,所以只有設(shè)置了 BIND_WAIVE_PRIORITY 后才會(huì) 4.0 和 4.0以前都兼容起來(lái)被當(dāng)做后臺(tái)任務(wù)對(duì)待。

  • BIND_DEBUG_UNBIND:

    用來(lái) debug 使用的

  • BIND_NOT_FOREGROUND

    不允許將綁定的 Service 的進(jìn)程提升到前臺(tái)進(jìn)程的優(yōu)先級(jí)拙友,它將仍然擁有和客戶端同樣的內(nèi)存優(yōu)先級(jí)为狸,所以在宿主進(jìn)程沒(méi)有被殺死的情況下,Service 的進(jìn)程也是不會(huì)被殺死的献宫。但是 cpu 可能會(huì)把它放在后臺(tái)執(zhí)行钥平。僅僅在這種情況下會(huì)有作用,宿主進(jìn)程在前端姊途,Service 進(jìn)程在后臺(tái)

  • BIND_ABOVE_CLIENT

    在這種情況下涉瘾,Service 進(jìn)程比 App 本身的進(jìn)程還有重要,當(dāng)設(shè)置后捷兰,內(nèi)存溢出的時(shí)候立叛,將會(huì)在關(guān)閉 Service 進(jìn)程前關(guān)閉 App 進(jìn)程。但是這種情況不能保證贡茅。

  • BIND_ALLOW_OOM_MANAGEMENT

    允許內(nèi)存管理系統(tǒng)管理 Service 的進(jìn)程秘蛇,允許系統(tǒng)在內(nèi)存不足的時(shí)候刪除這個(gè)進(jìn)程。

  • BIND_WAIVE_PRIORITY

    不影響 Service 進(jìn)程的優(yōu)先級(jí)的情況下顶考,允許 Service 進(jìn)程被加入后臺(tái)隊(duì)列中赁还。

  • BIND_IMPORITANT

    這個(gè)服務(wù)對(duì)于這個(gè)客戶端來(lái)說(shuō)是非常重要的,所以應(yīng)該提升到前臺(tái)進(jìn)程的級(jí)別驹沿。一般這個(gè)進(jìn)程
    會(huì)提升到可見(jiàn)的級(jí)別艘策,甚至客戶端在后臺(tái)的時(shí)候。

  • BIND_ADJUST_WITH_ACTIVITY

    如果從一個(gè) Activity 綁定渊季,則這個(gè) Service 進(jìn)程的優(yōu)先級(jí)和 Activity 是否對(duì)用戶可見(jiàn)有關(guān)朋蔫。

好了罚渐,就介紹到這里,由于個(gè)人水平有限驯妄,有錯(cuò)誤的地方荷并,請(qǐng)各位不吝賜教!

由于個(gè)人精力有限青扔,多個(gè)渠道發(fā)布源织,排版可能會(huì)有問(wèn)題。重點(diǎn)維護(hù) Android開(kāi)發(fā)家園

Android 開(kāi)發(fā)者家園
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赎懦,一起剝皮案震驚了整個(gè)濱河市雀鹃,隨后出現(xiàn)的幾起案子幻工,更是在濱河造成了極大的恐慌励两,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊颅,死亡現(xiàn)場(chǎng)離奇詭異当悔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)踢代,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門盲憎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胳挎,你說(shuō)我怎么就攤上這事饼疙。” “怎么了慕爬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵窑眯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我医窿,道長(zhǎng)磅甩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任姥卢,我火速辦了婚禮卷要,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘独榴。我一直安慰自己僧叉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布棺榔。 她就那樣靜靜地躺著瓶堕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掷豺。 梳的紋絲不亂的頭發(fā)上捞烟,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天薄声,我揣著相機(jī)與錄音,去河邊找鬼题画。 笑死默辨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苍息。 我是一名探鬼主播缩幸,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竞思!你這毒婦竟也來(lái)了表谊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盖喷,失蹤者是張志新(化名)和其女友劉穎爆办,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體课梳,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡距辆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暮刃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨算。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椭懊,靈堂內(nèi)的尸體忽然破棺而出诸蚕,到底是詐尸還是另有隱情,我是刑警寧澤氧猬,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布背犯,位于F島的核電站,受9級(jí)特大地震影響狂窑,放射性物質(zhì)發(fā)生泄漏媳板。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一泉哈、第九天 我趴在偏房一處隱蔽的房頂上張望蛉幸。 院中可真熱鬧,春花似錦丛晦、人聲如沸奕纫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匹层。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間升筏,已是汗流浹背撑柔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留您访,地道東北人铅忿。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灵汪,于是被迫代替她去往敵國(guó)和親檀训。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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