首先解釋一下什么是進程:
進程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,進程包含多個線程在運行。
在Android中,默認情況下,同一個應用程序內(nèi)的所有組件都是運行在同一個進程中的,大部分應用程序也不會去改變它。不過,如果需要指定某個特定組件所屬的進程,則可以利用manifest 文件來達到目的。
manifest文件中的每種組件元素——、 、 和——都支持定義android:process屬性,用于指定組件運行的進程。設(shè)置此屬性即可實現(xiàn)每個組件在各自的進程中運行,或者某幾個組件共享一個進程而其它組件運行于獨立的進程。設(shè)置此屬性也可以讓不同應用程序的組件運行在同一個進程中——實現(xiàn)多個應用程序共享同一個Linux用戶ID、賦予同樣的權(quán)限。
元素也支持android:process屬性,用于指定所有組件的默認進程。
如果內(nèi)存不足,可又有其它為用戶提供更緊急服務的進程需要更多內(nèi)存,Android可能會決定關(guān)閉一個進程。在此進程中運行著的應用程序組件也會因此被銷毀。當需要再次工作時,會為這些組件重新創(chuàng)建一個進程。
在決定關(guān)閉哪個進程的時候,Android系統(tǒng)會權(quán)衡它們相對用戶的重要程度。比如,相對于一個擁有可見activity的進程,更有可能去關(guān)閉一個activity已經(jīng)在屏幕上看不見的進程。也就是說,是否終止一個進程,取決于運行在此進程中組件的狀態(tài)
Android系統(tǒng)試圖盡可能長時間地保持應用程序進程,但為了新建或者運行更加重要的進程,總是需要清除過時進程來回收內(nèi)存。為了決定保留或終止哪個進程,根據(jù)進程內(nèi)運行的組件及這些組件的狀態(tài),系統(tǒng)把每個進程都劃入一個“重要性層次結(jié)構(gòu)”中。重要性最低的進程首先會被清除,然后是下一個最低的,依此類推,這都是恢復系統(tǒng)資源所必需的。
重要性層次結(jié)構(gòu)共有5級,以下列表按照重要程度列出了各類進程(第一類進程是最重要的,將最后一個被終止):
1.前臺進程
用戶當前操作所必須的進程。滿足以下任一條件時,進程被視作處于前臺:
其中運行著正與用戶交互的Activity(Activity對象的onResume()]方法已被調(diào)用)。
其中運行著被正與用戶交互的activity綁定的服務。
其中運行著“前臺”服務——服務以[startForeground()方式被調(diào)用。
其中運行著正在執(zhí)行生命周期回調(diào)方法(onCreate()、onStart()或onDestroy())的服務。
其中運行著正在執(zhí)行onReceive()方法的BroadcastReceiver。
一般而言,任何時刻前臺進程都是為數(shù)不多的,只有迫不得已——當內(nèi)存不足以維持它們同時運行時——才會被終止。通常,設(shè)備這時候已經(jīng)到了使用虛擬內(nèi)存的地步,終止一些前臺進程是為了保證用戶界面的及時響應。
2.可見進程
沒有前臺組件、但仍會影響用戶在屏幕上所見內(nèi)容的進程。滿足以下任一條件時,進程被認為是可見的:
其中運行著不在前臺的Activity,但用戶仍然可見到此
activity(onPause()方法被調(diào)用了)。比如以下場合就可能發(fā)生這種情況:前臺activity打開了一個對話框,而之前的activity還允許顯示在后面。
其中運行著被可見(或前臺)activity綁定的服務。
可見進程被認為是非常重要的進程,除非無法維持所有前臺進程同時運行了,它們是不會被終止的。
3.服務進程
此進程運行著由startService()方法啟動的服務,它不會升級為上述兩級別。盡管服務進程不直接和用戶所見內(nèi)容關(guān)聯(lián),但他們通常在執(zhí)行一些用戶關(guān)心的操作(比如在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺、可見進程同時運行,系統(tǒng)會保持服務進程的運行。
4.. 后臺進程
包含目前用戶不可見activity(Activity對象的onStop()方法已被調(diào)用)的進程。這些進程對用戶體驗沒有直接的影響,系統(tǒng)可能在任意時間終止它們,以回收內(nèi)存供前臺進程、可見進程及服務進程使用。通常會有很多后臺進程在運行,所以它們被保存在一個LRU(最近最少使用)列表中,以確保最近被用戶使用的activity最后一個被終止。如果一個activity正確實現(xiàn)了生命周期方法,并保存了當前的狀態(tài),則終止此類進程不會對用戶體驗產(chǎn)生可見的影響。因為在用戶返回時,activity會恢復所有可見的狀態(tài)。關(guān)于保存和恢復狀態(tài)的詳細信息,請參閱Activity文檔。
5..空進程
不含任何活動應用程序組件的進程。保留這種進程的唯一目的就是用作緩存,以改善下次在此進程中運行組件的啟動時間。為了在進程緩存和內(nèi)核緩存間平衡系統(tǒng)整體資源,系統(tǒng)經(jīng)常會終止這種進程。
依據(jù)進程中目前活躍組件的重要程度,Android會給進程評估一個盡可能高的級別。例如:如果一個進程中運行著一個服務和一個用戶可見的activity,則此進程會被評定為可見進程,而不是服務進程。
此外,一個進程的級別可能會由于其它進程的依賴而被提高——為其它進程提供服務的進程級別永遠不會低于使用此服務的進程。比如:如果A進程中的content provider為進程B中的客戶端提供服務,或進程A中的服務被進程B中的組件所調(diào)用,則A進程至少被視為與進程B同樣重要。
因為運行服務的進程級別是高于后臺activity進程的,所以,如果activity需要啟動一個長時間運行的操作,則為其啟動一個服務會比簡單地創(chuàng)建一個工作線程更好些——尤其是該操作時間比activity的生存期還要長的情況下。比如,一個activity要把圖片上傳至Web網(wǎng)站,就應該創(chuàng)建一個服務來執(zhí)行之,即使用戶離開了此activity,上傳還是會在后臺繼續(xù)運行。不論activity發(fā)生什么情況,使用服務可以保證操作至少擁有“服務進程”的優(yōu)先級。同理,廣播接收器broadcast receiver也是使用服務來處理耗時任務的,而不是簡單地把它放入線程中。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前題目:Android中的進程優(yōu)先級-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://chinadenli.net/article24/dsieje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站改版、虛擬主機、網(wǎng)站排名、網(wǎng)站策劃、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容