更快更好的學(xué)習(xí)Android進(jìn)程
Android是基于Linux內(nèi)核的軟件平臺(tái)和操作系統(tǒng),是由2007年由Google開(kāi)發(fā)而成,希望借助建立標(biāo)準(zhǔn)化、開(kāi)放式的移動(dòng)電話軟件平臺(tái),在移動(dòng)產(chǎn)業(yè)內(nèi)形成一個(gè)開(kāi)放式的生態(tài)系統(tǒng)。
Android盡量不去中止一個(gè)進(jìn)程,但是當(dāng)內(nèi)存不足的時(shí)候它必須中止一些老的線程。為了決定哪些進(jìn)程保留哪些進(jìn)程中止,Android給這些進(jìn)程一個(gè)“重要級(jí)”,這個(gè)級(jí)別取決于進(jìn)程中的組件和組件的狀態(tài)。最不重要的進(jìn)程先被中止,然后是次不重要的,依此類(lèi)推。重要級(jí)別有5個(gè)程度,以下詳細(xì)說(shuō)明:
1.有一個(gè)用戶正在交互的activity, (Activity對(duì)象的onResume()方法被調(diào)用). 有一個(gè)響應(yīng)用戶正在交互的activity的sercie.有一個(gè) Service 對(duì)象正在執(zhí)行生命周期的方法 (onCreate(), onStart(), or onDestroy()).有一個(gè) BroadcastReceiver 對(duì)象在執(zhí)行onReceive() 方法。
只有一些前臺(tái)Android進(jìn)程可以在任何時(shí)候都存在。他們是***一個(gè)被結(jié)束的――當(dāng)內(nèi)存低到根本連他們都不能運(yùn)行的時(shí)候。一般來(lái)說(shuō),在這種情況下,設(shè)備會(huì)進(jìn)行內(nèi)存調(diào)度,中止一些前臺(tái)進(jìn)程來(lái)保持對(duì)用戶交互的響應(yīng)。.
2.見(jiàn)進(jìn)程不包含前臺(tái)的組件但是會(huì)在屏幕上顯示。如果滿足了以下任意一個(gè)條件,進(jìn)程就可以視為可見(jiàn):有一個(gè)非前臺(tái)的但是仍然對(duì)用戶可見(jiàn)的activity。( onPause() 方法被調(diào)用). 這種情況發(fā)生于,例如,當(dāng)前前臺(tái)的activity是一個(gè)對(duì)話框,上一個(gè)activity還是可見(jiàn)的。 具有一個(gè)綁定到可見(jiàn)activity的service。一個(gè)可見(jiàn)的進(jìn)程是的重要程度很高,除非前臺(tái)進(jìn)程需要獲取它的資源,不然不會(huì)被中止。
3.服務(wù)進(jìn)程 中運(yùn)行著一個(gè)通過(guò) startService() 方法啟動(dòng)的service,這個(gè)service不屬于上面提到的2種更高重要性的,service所在的進(jìn)程雖然對(duì)用戶不是直接可見(jiàn)的,但是他們執(zhí)行了用戶非常關(guān)注的任務(wù)(比如播放mp3,從網(wǎng)絡(luò)下載數(shù)據(jù))。只要前臺(tái)進(jìn)程和可見(jiàn)進(jìn)程有足夠的內(nèi)存,系統(tǒng)不會(huì)回收他們。
4.后臺(tái)進(jìn)程 中運(yùn)行著一個(gè)對(duì)用戶不可見(jiàn)的activity(調(diào)用過(guò) onStop() 方法).這些進(jìn)程對(duì)用戶體驗(yàn)沒(méi)有直接的影響,可以在服務(wù)進(jìn)程、可見(jiàn)進(jìn)程、前臺(tái)進(jìn)程需要內(nèi)存的時(shí)候回收。通常。
系統(tǒng)中會(huì)有很多不可見(jiàn)進(jìn)程在運(yùn)行,他們被保存在LRU (least recently used) 列表中,以便內(nèi)存不足的時(shí)候被***時(shí)間回收。如果一個(gè)activity正確的執(zhí)行了它的生命周期,關(guān)閉這個(gè)Android進(jìn)程對(duì)于用戶體驗(yàn)沒(méi)有太大的影響。
5.空進(jìn)程 中未運(yùn)行任何程序組件。運(yùn)行這些進(jìn)程的唯一原因是作為一個(gè)緩存,縮短下次程序需要重新使用的啟動(dòng)時(shí)間。系統(tǒng)經(jīng)常中止這些進(jìn)程,這樣可以調(diào)節(jié)程序緩存和系統(tǒng)緩存的平衡。.Android進(jìn)程的重要性評(píng)級(jí)的時(shí)候,選取它***的級(jí)別。例如一個(gè)進(jìn)程中有一個(gè)service和可以可見(jiàn)的activity,則Android將此進(jìn)程評(píng)判為“可見(jiàn)進(jìn)程”而非“服務(wù)進(jìn)程。”
另外,當(dāng)被另外的一個(gè)進(jìn)程依賴的時(shí)候,某個(gè)進(jìn)程的級(jí)別可能會(huì)增高。一個(gè)為其他進(jìn)程服務(wù)的進(jìn)程永遠(yuǎn)不會(huì)比被服務(wù)的進(jìn)程重要級(jí)低。例如,進(jìn)程A中的content provider 正在為客戶進(jìn)程B提供數(shù)據(jù),或者A中的service綁定到進(jìn)程B中,那么A的重要級(jí)最少都是B的重要級(jí)。
因?yàn)榉?wù)進(jìn)程比后臺(tái)activity進(jìn)程重要級(jí)高,因此一個(gè)要進(jìn)行耗時(shí)工作的acitvity***啟動(dòng)一個(gè)service來(lái)做這個(gè)工作。而不是開(kāi)啟一個(gè)子進(jìn)程――特別是這個(gè)操作需要的時(shí)間比activity存在的時(shí)間還要長(zhǎng)的時(shí)候。例如,在后臺(tái)播放音樂(lè),向網(wǎng)上上傳攝像頭拍到的圖片。
使用service可以使進(jìn)程最少獲取到“Android進(jìn)程”級(jí)別的重要級(jí),而不用考慮acrivity目前是什么狀態(tài)。向 Broadcast receiver lifecycle 章節(jié)講到的, broadcast receivers做費(fèi)時(shí)的工作的時(shí)候,也應(yīng)該啟用一個(gè)服務(wù)而不是開(kāi)一個(gè)線程。
【編輯推薦】