轉自:http://blog.csdn.net/zsch591488385/article/details/27232881
一、iOS的“偽后台”程序
首先,先了解一下ios 中所謂的「后台進程」到底是怎么回事吧?
Let me be as clear as I can be: the iOS multitasking bar does not contain "a list of all running apps". It contains "a list of recently used apps". The user never has to manage background tasks on iOS.
首先我們得搞清楚的是,iOS 中所謂的「后台駐留」並不是指「執行中的程序」,而是「最近使用過的程序」,也可以瞧瞧Apple 的知識庫文章怎么寫的:
按兩下主畫面按鈕后,顯示的是「最近用過的應用程序」,所以別把它想成Mac OS X 中的Command + Tab 鍵所顯示的切換程序列;你可以試試看將iPhone 關機再開機,然后按兩下Home 鍵,應該會發現先前那些程式還是出現在那里,因為它其實是你最近使用過的程序使用記錄,或像是瀏覽器中的瀏覽記錄)。
如果你一個一個去清除 "后台駐留" 的程序,就像是一筆一筆刪除瀏覽記錄中的項目一樣,是沒有太大意義的(除非你不想讓其他人看到你曾經用過什么程式,或者想殺時間、太無聊了),也不會對電力或記憶體有什么幫助。
iOS 的多任務處理其實是很聰明的,系統會自動中止在背景執行的程序,在有需要時,也會將被中止的程式suspended(注:"中止的程式"不是指關閉程序,而是指由前台轉向后台的程序,程序在后台並不真正運行,不要和關閉程序混淆了) 從內存中移除。因此,iOS 裝置的使用者根本就不需要擔心怎么管理這些執行中或不在執行中的程序,盡管放心用、輕松玩就是了!
一般說來,所有程式進入背景后都還有5 秒的執行緩沖時間,有些程序可以要求延長到10 分鍾(這些當然是由開發人員在設計與提交程式時決定和聲明);
因此,在你按下Home 鍵后,本來的程式就會退到背景,如果它有額外的背景執行作業,超過10 分鍾還是會被iOS 中止;所以,還是別擔心了!
但是,也有例外情況,某些特殊類型的程式是被容許在背景中持續執行的,像是會持續在背景播放音樂的程序、GPS 程序、VOIP 程序、Newsstand 以及周邊配件附屬的程序,不過只要這些程序不再執行動作,就會變成中止的程式,像是音樂撥完了、雜志下載完了... 因此,使用者其實也沒必要太過留意這些程序。
you do not have to manage background tasks on iOS. The system handles almost every case for you and well written audio, GPS, VOIP, Newsstand and accessory apps will handle the rest.
二、IOS的“多任務”發展史
自從出現了操作系統以來,就沒有過所謂真正的“多任務”。所謂多任務,無非是CPU速度夠快而足以支撐極短時間內在多個進程內動作罷了。而所謂的“單任務”,無非是只能讓當前任務獨享資源罷了。
簡單來說,IOS 4 APP類型可以分為三種:
1. 保存現場。
即:按下Home鍵10秒內直接殺死進程,並釋放內存。一般說來,所有程序進入背景后都還有5 秒的執行緩沖時間,有些程序可以要求延長到10 分鍾(這些當然是由開發人員在設計與提交程式時決定和聲明);因此,在你按下Home 鍵后,本來的程式就會退到背景,如果它有額外的背景執行作業,超過10 分鍾還是會被iOS 中止。
2. iOS支持的“多任務”。
即:按下Home鍵轉入多任務狀態,保留在內存中,但只能系統允許的動作:比如GPS,比如VoIP,比如Streaming Music等等。
3. 真正的桌面級別的多任務。
即:只有Safari/Mail才是真正的多任務,蘋果嫡系大都都不是。這個級別的app在后台是沒有任何限制動作。(對於無限制動作的程序,一是會在用戶無察覺的情況下耗光電力,二是會有安全上面的問題)。
注意:對於上述三種級別,后兩種會占用內存的APP,也會在任意時間從內存中被砍掉,取決於你是否動用了其它app而導致內存不足。真正不會被砍掉的后台,只有蘋果那個通知系統。
其實可以回顧一下iOS是怎么一步步引入現在這個機制的:
1. 剛出生,什么都沒有,單純的單任務。
2. iPhone OS 3.0,引入通知架構。幾乎當年全部機型可用;Android晚了一年,2.2才有此功能,到這個時候相信才有90%上下機器用上。
3. iOS 4.0+,引入有限制的后台多任務。
搞這么復雜干嘛?直接像android一出生那樣所有app一個小虛擬機,無任何限制動作,讓根本沒有內存管理經驗和資源消耗概念的全世界最大民工群Java程序員們寫的app任意地跑着吧!
答案只有兩個:電力,安全。安全不說,如何在保持多任務優勢的同時,避免消耗過多電力,蘋果花了很多心思;而不是像webOS/Android一樣,簡單粗暴桌面級的多任務。iPhone 4甚至在硬件上面也下了苦功,利用3D層疊技術組裝A4芯片,內部元件高度集成,並把天線移至體表,增加內部電池空間。
三、IOS的內存管理
其實在iOS中,它的后台跟塞班,Windows不一樣,蘋果是偽后台。你雙擊Home鍵打開的列表,僅僅是打開一個叫做“近期打開程序列表”的東西。在塞班和Windows、安卓這些智能系統中,當你把一個程序放到后台,他是活動的,跟在前台沒有區別。而iOS不一樣,你將程序放到后台去之后,iOS是將此程序給停掉,包括聯網等等,各種進程都給停掉(iOS只給一部分進程留有后台運行權限,比如音樂播放之類的)。也就是說,這個程序基本算是死了……這樣帶來的好處就是,蘋果一直只能只有一個程序在工作,其他的都會停掉,所以非常流暢(基本可以這么說,某些特殊的進程可以在后台跑的)。當然,以前一直被蘋果用戶給詬病的就是QQ不能掛后台,一按Home鍵就掉線就是這個原因(當然,蘋果通過推送來解決這個問題)。雖然說程序被停了,但是,程序並沒有在內存中釋放。而是繼續放在內存中,這樣帶來的好處就是你再次打開程序的時候,會回復到你之前關閉程序的界面,程序快速的繼續運行。
那么,當內存中程序太多了,內存不夠的時候怎么辦?當內存不足的時候,iOS會依據自身判斷出程序的優先級,之后清理程序占用的內存。比如音樂,應該就屬於是優先級比較高的程序。iOS根據優先級,和使用次數來決定哪些程序首先清出后台。不只是簡單的看時間。將程序踢出內存,就是所謂的掛起。從而釋放內存,供新打開的程序使用。為了驗證這一點可越獄機型的朋友可以專門下個插件(SwitcherMod),能將掛起的程序在后台顯示為灰色透明,仍然在內存中的程序正常顯示。
而運行大型游戲及耗內存的應用之前,大家可能會明顯的感到卡頓,這是因為系統在釋放足夠大型程序運行的內存,可能涉及到很多的APP,這需要耗費一些CPU資源及時間,因此會產生卡頓
總結:你可以完全不去清后台,因為iOS會根據需求來自動釋放不必要的內存。但是iOS在釋放內存的時候,會占用CPU,導致短暫的卡頓。如果不在意這個,以后就直接忽略后台就好了。如果你覺得蘋果是完美的,不能有卡頓。那就及時多清清沒用的后台就好了。
四、Android后台機制
android大多應用沒有退出的設計其實是有道理的,這和系統對進程的調度機制有關系。如果你知道java,就能更清楚這機制了。其實和java的垃圾回收機制類似,系統有一個規則來回收內存。進行內存調度有個閥值,只有低於這個值系統才會按一個列表來關閉用戶不需要的東西。當然這個值默認設置得很小,所以你會看到內存老在很少的數值徘徊。但事實上他並不影響速度。相反加快了下次啟動應用的速度。這本來就是android標榜的優勢之一,如果人為去關閉進程,沒有太大必要。特別是自動關進程的軟件。 到這里有人會說了,那為什么內存少的時候運行大型程序會慢呢?其實很簡單,在內存剩余不多時打開大型程序,會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程序頻繁向系統申請內存的時候。這種情況下系統並不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。所以,論壇上有個更改內存閥值的程序可以有一定改善。 但改動也可能帶來一些問題,取決於值的設定。 那么,進程管理軟件有無必要呢?有的。就是在運行大型程序之前,你可以手動關閉一些進程釋放內存,可以顯著的提高運行速度。但一些小程序,完全可交由系統自己管理。談到這里,可能有的朋友會問,如果不關程序是不是會更耗電。我就說說 android后台的原理,你就明白了。android的應用在被切換到后台時,它其實已經被暫停了,並不會消耗cpu資源,只保留了運行狀態。所以為什么有的程序切出去重進會到主界面。但是,一個程序如果想要在后台處理些東西,如音樂播放,它就會開啟一個服務。服務可在后台持續運行,所以在后台耗電的也只有帶服務的應用了。這個在進程管理軟件里能看到,標簽是service。至於廣播什么的我就不涉及了。所以沒有帶服務的應用在后台是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程序時,會更快,因為不需要讀取界面資源,何必要關掉他們抹殺這個android的優點呢? 還有一個。為什么android一個應用看起來那么耗內存。大家知道,android上的應用是java,當然需要虛擬機,而android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。這樣設計的原因是可以避免虛擬機崩潰導致整個系統崩潰,但代價就是需要更多內存。 以上這些設計確保了android的穩定性,正常情況下最多單個程序崩潰,但整個系統不會崩潰,也永遠沒有內存不足的提示出現。大家可能是被windows毒害得太深了,總想保留更多的內存,但實際上這並不一定會提升速度,相反卻喪失了程序啟動快的這一系統特色,很沒必要。大家不妨按我說的習慣來用用這個系統。最后推薦一款進程管理軟件,systempanel,market上能搜到,界面友好啟動快,功能也不錯,用於手動關閉進程很好的軟件。
五、總結
1、后台程序的運行狀態
IOS:分三類應用,大部分應用切換到后台會停止運行,部分應用(音樂、voip)在任務完成后也會停止,后台應用不耗cpu,但應用內存保持占用狀態
Android:切換后台后應用進入onstop()狀態,不是真正停止,這種狀態下也不消耗cpu,部分Android應用自帶后台服務,后台服務不會停止,需要消耗CPU,應用內存都會保持占用狀態
2、后台應用內存管理
IOS:后台應用內存保持,在新開啟應用申請內存時會有一套完善機制(重要性、打開次數等)確定回收哪些應用的內存,並為新開啟的應用分配足夠的內存;
Android:設置內存閥值,只有低於這個值系統才會按一個列表來關閉用戶不需要的東西,在內存剩余不多時打開大型程序,會觸發系統自身的調進程調度策略十分消耗系統資源;每一個android都運行在一個虛擬機中,所以更耗內存