進(jìn)程和應(yīng)用程序生命周期(活動(dòng)五)

在大多數(shù)情況下初狰,每個(gè)Android應(yīng)用程序都在自己的Linux進(jìn)程中運(yùn)行互例。當(dāng)需要運(yùn)行某些代碼時(shí),將為應(yīng)用程序創(chuàng)建此過(guò)程媳叨,并且該過(guò)程將一直運(yùn)行,直到不再需要它為止武福,并且系統(tǒng)需要回收其內(nèi)存以供其他應(yīng)用程序使用扩然。

Android的一個(gè)不尋常的基本特征是應(yīng)用程序進(jìn)程的生命周期不是由應(yīng)用程序本身直接控制的。相反界睁,它由系統(tǒng)通過(guò)系統(tǒng)知道正在運(yùn)行的應(yīng)用程序部分的組合,這些事物對(duì)用戶的重要性以及系統(tǒng)中可用的總體內(nèi)存量來(lái)確定翻斟。

應(yīng)用程序開(kāi)發(fā)人員必須了解不同的應(yīng)用程序組件(特別是Activity,Service和BroadcastReceiver)如何影響應(yīng)用程序進(jìn)程的生命周期嘹履。不正確使用這些組件會(huì)導(dǎo)致系統(tǒng)在執(zhí)行重要工作時(shí)終止應(yīng)用程序的進(jìn)程债热。

進(jìn)程生命周期錯(cuò)誤的一個(gè)常見(jiàn)示例是BroadcastReceiver,它在BroadcastReceiver.onReceive()方法中接收Intent時(shí)啟動(dòng)一個(gè)線程焕刮,然后從該函數(shù)返回墙杯。一旦返回,系統(tǒng)會(huì)認(rèn)為BroadcastReceiver不再處于活動(dòng)狀態(tài)高镐,因此不再需要其托管進(jìn)程(除非其他應(yīng)用程序組件處于活動(dòng)狀態(tài))。因此观腊,系統(tǒng)可能隨時(shí)終止進(jìn)程以回收內(nèi)存岩喷,并且這樣做會(huì)終止在進(jìn)程中運(yùn)行的生成的線程。此問(wèn)題的解決方案通常是從BroadcastReceiver安排JobService婶溯,以便系統(tǒng)知道在該過(guò)程中仍有活動(dòng)的工作偷霉。
為了確定在內(nèi)存不足時(shí)應(yīng)該殺死哪些進(jìn)程,Android會(huì)根據(jù)其中運(yùn)行的組件以及這些組件的狀態(tài)將每個(gè)進(jìn)程置于“重要性層次結(jié)構(gòu)”中类少。 這些流程類型(按重要性排序):

1、前臺(tái)進(jìn)程是用戶當(dāng)前正在執(zhí)行的操作所必需的進(jìn)程信轿。

各種應(yīng)用程序組件可以使其包含進(jìn)程以不同方式被視為前景。 如果滿足以下任何條件倘核,則認(rèn)為進(jìn)程處于前臺(tái):

  • 它在用戶正在與之交互的屏幕頂部運(yùn)行一個(gè)Activity(已調(diào)用其onResume()方法)即彪。
  • 它有一個(gè)當(dāng)前正在運(yùn)行的BroadcastReceiver(它的BroadcastReceiver.onReceive()方法正在執(zhí)行)。
  • 它有一個(gè)服務(wù)隶校,當(dāng)前正在其一個(gè)回調(diào)中執(zhí)行代碼(Service.onCreate(),Service.onStart()或Service.onDestroy())绰疤。

在系統(tǒng)中只會(huì)有一些這樣的過(guò)程舞终,如果內(nèi)存太低甚至這些過(guò)程都不能繼續(xù)運(yùn)行,這些過(guò)程只會(huì)作為最后的手段被殺死。 通常煎谍,此時(shí),設(shè)備已達(dá)到內(nèi)存分頁(yè)狀態(tài)满俗,因此需要此操作以保持用戶界面響應(yīng)作岖。

2、一個(gè)可見(jiàn)的過(guò)程正在進(jìn)行用戶當(dāng)前意識(shí)到的工作痘儡,因此殺死它會(huì)對(duì)用戶體驗(yàn)產(chǎn)生明顯的負(fù)面影響沉删。

在以下條件下,可以看到一個(gè)過(guò)程:

  • 它正在運(yùn)行一個(gè)活動(dòng)矾瑰,該活動(dòng)在屏幕上對(duì)用戶可見(jiàn),但不在前臺(tái)(已調(diào)用其onPause()方法)凉夯。 例如,如果前景Activity顯示為允許在其后面看到前一個(gè)Activity的對(duì)話框劲够,則可能會(huì)發(fā)生這種情況。
  • 它有一個(gè)作為前臺(tái)服務(wù)運(yùn)行的服務(wù)再沧,通過(guò)Service.startForeground()(它要求系統(tǒng)將服務(wù)視為用戶知道的東西,或者對(duì)它們基本上是可見(jiàn)的)淤堵。
  • 它正在托管系統(tǒng)用于用戶知道的特定功能的服務(wù)顷扩,例如動(dòng)態(tài)壁紙,輸入法服務(wù)等扎阶。

在系統(tǒng)中運(yùn)行的這些進(jìn)程的數(shù)量比前臺(tái)進(jìn)程更少婶芭,但仍然是相對(duì)受控的。 這些進(jìn)程被認(rèn)為是非常重要的犀农,除非需要這樣做以保持所有前臺(tái)進(jìn)程運(yùn)行,否則不會(huì)被殺死赁濒。

3孟害、服務(wù)進(jìn)程是一個(gè)持有使用startService()方法啟動(dòng)的服務(wù)的進(jìn)程。

雖然用戶不能直接看到這些進(jìn)程击你,但它們通常是用戶關(guān)心的事情(例如后臺(tái)網(wǎng)絡(luò)數(shù)據(jù)上傳或下載)耘子,因此系統(tǒng)將始終保持這些進(jìn)程運(yùn)行,除非沒(méi)有足夠的內(nèi)存來(lái)保留所有進(jìn)程 前景和可見(jiàn)過(guò)程谷誓。

已經(jīng)運(yùn)行了很長(zhǎng)時(shí)間(例如30分鐘或更長(zhǎng)時(shí)間)的服務(wù)可能會(huì)被降級(jí)捍歪,以允許其進(jìn)程下降到下面描述的緩存LRU列表鸵钝。 這有助于避免出現(xiàn)內(nèi)存泄漏或其他問(wèn)題的長(zhǎng)時(shí)間運(yùn)行服務(wù)占用大量RAM而導(dǎo)致系統(tǒng)無(wú)法有效使用緩存進(jìn)程的情況庐镐。

4、緩存進(jìn)程是當(dāng)前不需要的進(jìn)程必逆,因此當(dāng)其他地方需要內(nèi)存時(shí),系統(tǒng)可以根據(jù)需要自由地終止進(jìn)程粟矿。

在正常運(yùn)行的系統(tǒng)中损拢,這些是內(nèi)存管理中涉及的唯一過(guò)程:運(yùn)行良好的系統(tǒng)將始終具有多個(gè)緩存進(jìn)程(用于在應(yīng)用程序之間進(jìn)行更有效的切換),并根據(jù)需要定期終止最舊的進(jìn)程掏秩。只有在非常關(guān)鍵(且不可染D贰)的情況下,系統(tǒng)才會(huì)到達(dá)所有緩存進(jìn)程被殺死的點(diǎn)胆筒,并且必須開(kāi)始終止服務(wù)進(jìn)程。

這些進(jìn)程通常包含一個(gè)或多個(gè)當(dāng)前對(duì)用戶不可見(jiàn)的Activity實(shí)例(已調(diào)用并返回onStop()方法)。如果他們正確地實(shí)現(xiàn)了他們的活動(dòng)生命周期(請(qǐng)參閱活動(dòng)以獲取更多詳細(xì)信息)派桩,當(dāng)系統(tǒng)終止此類流程時(shí)蚌斩,它不會(huì)影響用戶返回該應(yīng)用程序時(shí)的體驗(yàn):它可以在重新創(chuàng)建關(guān)聯(lián)活動(dòng)時(shí)恢復(fù)以前保存的狀態(tài)一個(gè)新的過(guò)程。

這些進(jìn)程保存在偽LRU列表中员魏,列表中的最后一個(gè)進(jìn)程是第一個(gè)被回收內(nèi)存的進(jìn)程叠聋。在此列表上排序的確切策略是平臺(tái)的實(shí)現(xiàn)細(xì)節(jié),但通常它會(huì)嘗試在其他類型的進(jìn)程之前保留更多有用的進(jìn)程(一個(gè)托管用戶的主應(yīng)用程序碌补,他們看到的最后一個(gè)活動(dòng)等)棉饶。還可以應(yīng)用其他用于終止進(jìn)程的策略:對(duì)允許的進(jìn)程數(shù)量的硬限制照藻,對(duì)進(jìn)程可以持續(xù)緩存的時(shí)間量的限制等汗侵。

在決定如何對(duì)流程進(jìn)行分類時(shí),系統(tǒng)將根據(jù)流程中當(dāng)前活動(dòng)的所有組件中最重要的級(jí)別做出決策晰韵。 有關(guān)每個(gè)組件如何對(duì)流程的整個(gè)生命周期做出貢獻(xiàn)的更多詳細(xì)信息宫屠,請(qǐng)參閱Activity,Service和BroadcastReceiver文檔浪蹂。 每個(gè)類的文檔都更詳細(xì)地描述了它們?nèi)绾斡绊懫鋺?yīng)用程序的整個(gè)生命周期。

還可以基于進(jìn)程對(duì)其具有的其他依賴性來(lái)增加進(jìn)程的優(yōu)先級(jí)古劲。 例如缰猴,如果進(jìn)程A已使用Context.BIND_AUTO_CREATE標(biāo)志綁定到Service,或者正在進(jìn)程B中使用ContentProvider闷堡,則進(jìn)程B的分類將始終至少與進(jìn)程A一樣重要疑故。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踱阿,隨后出現(xiàn)的幾起案子钦铁,更是在濱河造成了極大的恐慌,老刑警劉巖牛曹,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黎比,死亡現(xiàn)場(chǎng)離奇詭異腺办,居然都是意外死亡糟描,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)躬拢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人堤瘤,你說(shuō)我怎么就攤上這事验辞。” “怎么了拴泌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵惊橱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我回季,道長(zhǎng)正林,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任瘾杭,我火速辦了婚禮哪亿,結(jié)果婚禮上贤笆,老公的妹妹穿的比我還像新娘。我一直安慰自己篡殷,他們只是感情好埋涧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布奇瘦。 她就那樣靜靜地躺著劲弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邑跪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天砸琅,我揣著相機(jī)與錄音轴踱,去河邊找鬼。 笑死诱篷,一個(gè)胖子當(dāng)著我的面吹牛嘁傀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播细办,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笑撞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茴肥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瞬铸,失蹤者是張志新(化名)和其女友劉穎嗓节,沒(méi)想到半個(gè)月后皆警,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸵隧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珊蟀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靡羡。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖描扯,靈堂內(nèi)的尸體忽然破棺而出趟薄,到底是詐尸還是另有隱情,我是刑警寧澤杭煎,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布羡铲,位于F島的核電站,受9級(jí)特大地震影響也切,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疆股,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一倒槐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧两残,春花似錦把跨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峰鄙。三九已至太雨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囊扳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工狭瞎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊锭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓碗殷,卻偏偏與公主長(zhǎng)得像速缨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旬牲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,726評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理牍陌,服務(wù)發(fā)現(xiàn)员咽,斷路器,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 玩過(guò)了玉米須茶包契讲,蒲公英茶包滑频,出于什么原因,想玩一下桃仁山楂紅糖茶包呢峡迷? 第一個(gè)原因必須是有空了 第二原因嘛你虹,我想...
    隱_ef6e閱讀 232評(píng)論 0 2
  • “喂彤避,這是我的位置!”“……”沉默一會(huì)琉预,他低下頭董饰,連人帶椅挪到旁邊。 1圆米、 萍盯著鬧鐘卒暂,滴答、滴答娄帖、滴答…… 每一...
    唐夕_ai閱讀 587評(píng)論 2 4
  • 于2016年9月18日12點(diǎn)也祠,大四的生產(chǎn)實(shí)習(xí)結(jié)束了,是的块茁,我已經(jīng)大四了齿坷,回首我的大學(xué),算了数焊,懶得回首永淌,不過(guò),既...
    曲大仙兒閱讀 254評(píng)論 0 1