首先解釋一下什么是進(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ì)去改變它。不過(guò),如果需要指定某個(gè)特定組件所屬的進(jìn)程,則可以利用manifest 文件來(lái)達(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è)擁有可見(jiàn)activity的進(jìn)程,更有可能去關(guān)閉一個(gè)activity已經(jīng)在屏幕上看不見(jiàn)的進(jìn)程。也就是說(shuō),是否終止一個(gè)進(jìn)程,取決于運(yùn)行在此進(jìn)程中組件的狀態(tài)
Android系統(tǒng)試圖盡可能長(zhǎng)時(shí)間地保持應(yīng)用程序進(jìn)程,但為了新建或者運(yùn)行更加重要的進(jìn)程,總是需要清除過(guò)時(shí)進(jìn)程來(lái)回收內(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.可見(jiàn)進(jìn)程
沒(méi)有前臺(tái)組件、但仍會(huì)影響用戶在屏幕上所見(jiàn)內(nèi)容的進(jìn)程。滿足以下任一條件時(shí),進(jìn)程被認(rèn)為是可見(jiàn)的:
其中運(yùn)行著不在前臺(tái)的Activity,但用戶仍然可見(jiàn)到此
activity(onPause()方法被調(diào)用了)。比如以下場(chǎng)合就可能發(fā)生這種情況:前臺(tái)activity打開(kāi)了一個(gè)對(duì)話框,而之前的activity還允許顯示在后面。
其中運(yùn)行著被可見(jiàn)(或前臺(tái))activity綁定的服務(wù)。
可見(jiàn)進(jìn)程被認(rèn)為是非常重要的進(jìn)程,除非無(wú)法維持所有前臺(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)程不直接和用戶所見(jiàn)內(nèi)容關(guān)聯(lián),但他們通常在執(zhí)行一些用戶關(guān)心的操作(比如在后臺(tái)播放音樂(lè)或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺(tái)、可見(jiàn)進(jìn)程同時(shí)運(yùn)行,系統(tǒng)會(huì)保持服務(wù)進(jìn)程的運(yùn)行。
4.. 后臺(tái)進(jìn)程
包含目前用戶不可見(jiàn)activity(Activity對(duì)象的onStop()方法已被調(diào)用)的進(jìn)程。這些進(jìn)程對(duì)用戶體驗(yàn)沒(méi)有直接的影響,系統(tǒng)可能在任意時(shí)間終止它們,以回收內(nèi)存供前臺(tái)進(jìn)程、可見(jià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)生可見(jiàn)的影響。因?yàn)樵谟脩舴祷貢r(shí),activity會(huì)恢復(fù)所有可見(jiàn)的狀態(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è)用戶可見(jiàn)的activity,則此進(jìn)程會(huì)被評(píng)定為可見(jiàn)進(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è)長(zhǎng)時(shí)間運(yùn)行的操作,則為其啟動(dòng)一個(gè)服務(wù)會(huì)比簡(jiǎn)單地創(chuàng)建一個(gè)工作線程更好些——尤其是該操作時(shí)間比activity的生存期還要長(zhǎng)的情況下。比如,一個(gè)activity要把圖片上傳至Web網(wǎng)站,就應(yīng)該創(chuàng)建一個(gè)服務(wù)來(lái)執(zhí)行之,即使用戶離開(kāi)了此activity,上傳還是會(huì)在后臺(tái)繼續(xù)運(yùn)行。不論activity發(fā)生什么情況,使用服務(wù)可以保證操作至少擁有“服務(wù)進(jìn)程”的優(yōu)先級(jí)。同理,廣播接收器broadcast receiver也是使用服務(wù)來(lái)處理耗時(shí)任務(wù)的,而不是簡(jiǎn)單地把它放入線程中。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:Android中的進(jìn)程優(yōu)先級(jí)-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://jinyejixie.com/article24/dsieje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站改版、虛擬主機(jī)、網(wǎng)站排名、網(wǎng)站策劃、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容