溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-06-18 10:26:41 來源:網(wǎng)絡(luò) 閱讀:273 作者:啊希 欄目:移動(dòng)開發(fā)

一.概述

首先解釋一下什么是進(jìn)程: 
進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,進(jìn)程包含多個(gè)線程在運(yùn)行。

在Android中,默認(rèn)情況下,同一個(gè)應(yīng)用程序內(nèi)的所有組件都是運(yùn)行在同一個(gè)進(jìn)程中的,大部分應(yīng)用程序也不會(huì)去改變它。不過,如果需要指定某個(gè)特定組件所屬的進(jìn)程,則可以利用manifest 文件來達(dá)到目的。

manifest文件中的每種組件元素——、 、 和——都支持定義android:process屬性,用于指定組件運(yùn)行的進(jìn)程。設(shè)置此屬性即可實(shí)現(xiàn)每個(gè)組件在各自的進(jìn)程中運(yùn)行,或者某幾個(gè)組件共享一個(gè)進(jìn)程而其它組件運(yùn)行于獨(dú)立的進(jìn)程。設(shè)置此屬性也可以讓不同應(yīng)用程序的組件運(yùn)行在同一個(gè)進(jìn)程中——實(shí)現(xiàn)多個(gè)應(yīng)用程序共享同一個(gè)Linux用戶ID、賦予同樣的權(quán)限。

元素也支持android:process屬性,用于指定所有組件的默認(rèn)進(jìn)程。

如果內(nèi)存不足,可又有其它為用戶提供更緊急服務(wù)的進(jìn)程需要更多內(nèi)存,Android可能會(huì)決定關(guān)閉一個(gè)進(jìn)程。在此進(jìn)程中運(yùn)行著的應(yīng)用程序組件也會(huì)因此被銷毀。當(dāng)需要再次工作時(shí),會(huì)為這些組件重新創(chuàng)建一個(gè)進(jìn)程。

在決定關(guān)閉哪個(gè)進(jìn)程的時(shí)候,Android系統(tǒng)會(huì)權(quán)衡它們相對(duì)用戶的重要程度。比如,相對(duì)于一個(gè)擁有可見activity的進(jìn)程,更有可能去關(guān)閉一個(gè)activity已經(jīng)在屏幕上看不見的進(jìn)程。也就是說,是否終止一個(gè)進(jìn)程,取決于運(yùn)行在此進(jìn)程中組件的狀態(tài)

二.進(jìn)程的生命周期

Android系統(tǒng)試圖盡可能長時(shí)間地保持應(yīng)用程序進(jìn)程,但為了新建或者運(yùn)行更加重要的進(jìn)程,總是需要清除過時(shí)進(jìn)程來回收內(nèi)存。為了決定保留或終止哪個(gè)進(jìn)程,根據(jù)進(jìn)程內(nèi)運(yùn)行的組件及這些組件的狀態(tài),系統(tǒng)把每個(gè)進(jìn)程都劃入一個(gè)“重要性層次結(jié)構(gòu)”中。重要性最低的進(jìn)程首先會(huì)被清除,然后是下一個(gè)最低的,依此類推,這都是恢復(fù)系統(tǒng)資源所必需的。 
重要性層次結(jié)構(gòu)共有5級(jí),以下列表按照重要程度列出了各類進(jìn)程(第一類進(jìn)程是最重要的,將最后一個(gè)被終止):

1.前臺(tái)進(jìn)程 
用戶當(dāng)前操作所必須的進(jìn)程。滿足以下任一條件時(shí),進(jìn)程被視作處于前臺(tái):

  • 其中運(yùn)行著正與用戶交互的Activity(Activity對(duì)象的onResume()]方法已被調(diào)用)。

  • 其中運(yùn)行著被正與用戶交互的activity綁定的服務(wù)。

  • 其中運(yùn)行著“前臺(tái)”服務(wù)——服務(wù)以[startForeground()方式被調(diào)用。

  • 其中運(yùn)行著正在執(zhí)行生命周期回調(diào)方法(onCreate()、onStart()或onDestroy())的服務(wù)。

  • 其中運(yùn)行著正在執(zhí)行onReceive()方法的BroadcastReceiver。

一般而言,任何時(shí)刻前臺(tái)進(jìn)程都是為數(shù)不多的,只有迫不得已——當(dāng)內(nèi)存不足以維持它們同時(shí)運(yùn)行時(shí)——才會(huì)被終止。通常,設(shè)備這時(shí)候已經(jīng)到了使用虛擬內(nèi)存的地步,終止一些前臺(tái)進(jìn)程是為了保證用戶界面的及時(shí)響應(yīng)。

2.可見進(jìn)程 
沒有前臺(tái)組件、但仍會(huì)影響用戶在屏幕上所見內(nèi)容的進(jìn)程。滿足以下任一條件時(shí),進(jìn)程被認(rèn)為是可見的:

  • 其中運(yùn)行著不在前臺(tái)的Activity,但用戶仍然可見到此

  • activity(onPause()方法被調(diào)用了)。比如以下場合就可能發(fā)生這種情況:前臺(tái)activity打開了一個(gè)對(duì)話框,而之前的activity還允許顯示在后面。

  • 其中運(yùn)行著被可見(或前臺(tái))activity綁定的服務(wù)。

可見進(jìn)程被認(rèn)為是非常重要的進(jìn)程,除非無法維持所有前臺(tái)進(jìn)程同時(shí)運(yùn)行了,它們是不會(huì)被終止的。

3.服務(wù)進(jìn)程 
此進(jìn)程運(yùn)行著由startService()方法啟動(dòng)的服務(wù),它不會(huì)升級(jí)為上述兩級(jí)別。盡管服務(wù)進(jìn)程不直接和用戶所見內(nèi)容關(guān)聯(lián),但他們通常在執(zhí)行一些用戶關(guān)心的操作(比如在后臺(tái)播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺(tái)、可見進(jìn)程同時(shí)運(yùn)行,系統(tǒng)會(huì)保持服務(wù)進(jìn)程的運(yùn)行。

4.. 后臺(tái)進(jìn)程 
包含目前用戶不可見activity(Activity對(duì)象的onStop()方法已被調(diào)用)的進(jìn)程。這些進(jìn)程對(duì)用戶體驗(yàn)沒有直接的影響,系統(tǒng)可能在任意時(shí)間終止它們,以回收內(nèi)存供前臺(tái)進(jìn)程、可見進(jìn)程及服務(wù)進(jìn)程使用。通常會(huì)有很多后臺(tái)進(jìn)程在運(yùn)行,所以它們被保存在一個(gè)LRU(最近最少使用)列表中,以確保最近被用戶使用的activity最后一個(gè)被終止。如果一個(gè)activity正確實(shí)現(xiàn)了生命周期方法,并保存了當(dāng)前的狀態(tài),則終止此類進(jìn)程不會(huì)對(duì)用戶體驗(yàn)產(chǎn)生可見的影響。因?yàn)樵谟脩舴祷貢r(shí),activity會(huì)恢復(fù)所有可見的狀態(tài)。關(guān)于保存和恢復(fù)狀態(tài)的詳細(xì)信息,請(qǐng)參閱Activity文檔。

5..空進(jìn)程 
不含任何活動(dòng)應(yīng)用程序組件的進(jìn)程。保留這種進(jìn)程的唯一目的就是用作緩存,以改善下次在此進(jìn)程中運(yùn)行組件的啟動(dòng)時(shí)間。為了在進(jìn)程緩存和內(nèi)核緩存間平衡系統(tǒng)整體資源,系統(tǒng)經(jīng)常會(huì)終止這種進(jìn)程。

依據(jù)進(jìn)程中目前活躍組件的重要程度,Android會(huì)給進(jìn)程評(píng)估一個(gè)盡可能高的級(jí)別。例如:如果一個(gè)進(jìn)程中運(yùn)行著一個(gè)服務(wù)和一個(gè)用戶可見的activity,則此進(jìn)程會(huì)被評(píng)定為可見進(jìn)程,而不是服務(wù)進(jìn)程。

此外,一個(gè)進(jìn)程的級(jí)別可能會(huì)由于其它進(jìn)程的依賴而被提高——為其它進(jìn)程提供服務(wù)的進(jìn)程級(jí)別永遠(yuǎn)不會(huì)低于使用此服務(wù)的進(jìn)程。比如:如果A進(jìn)程中的content provider為進(jìn)程B中的客戶端提供服務(wù),或進(jìn)程A中的服務(wù)被進(jìn)程B中的組件所調(diào)用,則A進(jìn)程至少被視為與進(jìn)程B同樣重要。

因?yàn)檫\(yùn)行服務(wù)的進(jìn)程級(jí)別是高于后臺(tái)activity進(jìn)程的,所以,如果activity需要啟動(dòng)一個(gè)長時(shí)間運(yùn)行的操作,則為其啟動(dòng)一個(gè)服務(wù)會(huì)比簡單地創(chuàng)建一個(gè)工作線程更好些——尤其是該操作時(shí)間比activity的生存期還要長的情況下。比如,一個(gè)activity要把圖片上傳至Web網(wǎng)站,就應(yīng)該創(chuàng)建一個(gè)服務(wù)來執(zhí)行之,即使用戶離開了此activity,上傳還是會(huì)在后臺(tái)繼續(xù)運(yùn)行。不論activity發(fā)生什么情況,使用服務(wù)可以保證操作至少擁有“服務(wù)進(jìn)程”的優(yōu)先級(jí)。同理,廣播接收器broadcast receiver也是使用服務(wù)來處理耗時(shí)任務(wù)的,而不是簡單地把它放入線程中。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI