仍然有很多人不知道 iOS 中的多任務處理是如何運作的。然而,首先需要指出的是,這並不是真正的多工處理,而是一個非常聰明的解決方案,不會給系統或使用者帶來負擔。
人們經常聽到一種迷信,認為iOS中後台運行的應用程式會佔用操作內存,從而導致系統速度變慢和電池壽命縮短,因此用戶應該手動將其關閉。多工作列實際上並不包含所有正在運行的後台進程的列表,而僅包含最近啟動的應用程式。因此,除了少數情況外,使用者不必擔心後台運行的進程。當您按下“主頁”按鈕時,應用程式通常會進入睡眠狀態或關閉,以便它不再載入處理器或電池,並在必要時釋放必要的記憶體。
因此,當您有數十個進程運行時,這並不是成熟的多任務處理,只有一個應用程式始終在前台運行,必要時會暫停或完全關閉。只有少數輔助進程在後台運行。這就是為什麼您很少會在 iOS 上遇到應用程式崩潰的原因,例如 Android 因運行用戶必須處理的應用程式而不堪重負。一方面,這使得使用設備變得不愉快,另一方面,它會導致例如啟動緩慢和應用程式之間的轉換緩慢。
應用程式運行時類型
iOS 裝置上的應用程式處於以下 5 種狀態之一:
- 跑步: 應用程式已啟動並在前台運行
- 背景: 它仍在運行但在背景運行(我們可以使用其他應用程式)
- 暫停: 仍在使用 RAM 但未運行
- 不活動: 應用程式正在執行但間接命令(例如,當您在應用程式運行時鎖定裝置時)
- 未運行: 應用程式已終止或尚未啟動
當應用程式進入背景以免打擾時,就會出現混亂。當您按下「主頁」按鈕或使用手勢關閉應用程式 (iPad) 時,應用程式將進入背景。大多數應用程式都會在幾秒鐘內掛起(它們存儲在iDevice 的RAM 中,因此可以快速啟動,它們不會給處理器加載太多,從而節省電池壽命)您可能會認為,如果應用程式繼續使用內存,那麼您就可以了手動刪除它以釋放它。但你不必這樣做,因為 iOS 會為你做這件事。如果您在後台暫停了要求較高的應用程序,例如使用大量 RAM 的遊戲,iOS 會在必要時自動將其從內存中刪除,您可以通過點擊應用程式圖標來重新啟動它。
這些狀態都不會反映在多工作列中,面板僅顯示最近啟動的應用程式列表,無論應用程式是停止、暫停還是在背景運行。您可能還注意到目前正在執行的應用程式沒有出現在「多工」面板中
後台任務
通常,當您按下主頁按鈕時,該應用程式將在背景運行,如果您不使用它,它會在五秒鐘內自動暫停。因此,例如,如果您正在下載播客,系統會將其評估為正在運行的應用程序,並將終止延遲十分鐘。最晚十分鐘後,該進程將從記憶體中釋放。簡而言之,如果完成下載的時間不超過 10 分鐘,您不必擔心按下主頁按鈕會中斷下載。
無限期後台運行
如果不活動,系統會在五秒鐘內終止應用程序,如果有下載,則會延遲十分鐘終止。然而,有少數應用程式需要在背景運行。以下是一些可以在 iOS 5 中無限期地在背景運行的應用程式範例:
- 播放聲音且必須中斷一段時間的應用程式(在通話期間暫停音樂等),
- 追蹤您位置的應用程式(導航軟體),
- 接收 VoIP 呼叫的應用程序,例如,如果您使用 Skype,即使應用程式在後台,您也可以接聽呼叫,
- 自動下載(例如報亭)。
如果所有應用程式不再執行任務(例如背景下載),則應關閉它們。但是,也有一些例外情況會在背景持續運行,例如本機郵件應用程式。如果它們在背景運行,則會佔用記憶體、CPU 使用率或縮短電池壽命
允許無限期在背景運行的應用程式可以在運行時執行任何操作,從播放音樂到下載新的播客劇集。
正如我之前提到的,用戶永遠不需要關閉後台運行的應用程式。唯一的例外是當後台運行的應用程式崩潰或無法正確從睡眠狀態喚醒時。然後用戶可以在多任務欄中手動關閉應用程序,但這種情況很少發生。
因此,一般來說,您不需要管理後台進程,因為系統會自行處理它們。這就是為什麼 iOS 是一個如此新鮮且快速的系統。
從開發者的角度來看
作為多工處理的一部分,應用程式可以對總共六種不同的狀態做出反應:
1.applicationWillResignActive
翻譯過來,這個狀態意味著該應用程式將在未來(幾毫秒的時間)辭去活動應用程式(即前台應用程式)的角色。例如,在使用應用程式時收到呼叫時會發生這種情況,但同時,此方法也會在應用程式進入背景之前導致這種狀態,因此您需要考慮這些變更。此方法也適用於,例如,當有來電時,它會暫停正在執行的所有活動,並等待通話結束。
2.應用程式DidEnterBackground
該狀態表示應用程式已進入背景。開發人員應該使用此方法掛起所有不一定需要在背景運行的進程,並清除內存中未使用的數據和其他進程,例如到期計時器、從內存中清除不一定需要的已加載圖像或關閉與伺服器的連接,除非應用程式在背景完成連接至關重要。當在應用程式中呼叫該方法時,如果不需要應用程式的某些部分在背景運行,則它本質上應該用於完全掛起應用程式。
3.應用程式將進入前台
此狀態與第一個狀態相反,在第一個狀態中應用程式將退回至活動狀態。該狀態僅意味著正在睡眠的應用程式將從後台恢復並在接下來的幾毫秒內出現在前台。開發人員應該使用此方法來恢復應用程式在背景時不活動的任何進程。應重新建立與伺服器的連接,重置計時器,將映像和資料載入到記憶體中,並且可以在使用者再次看到載入的應用程式之前恢復其他必要的進程。
4. applicationDidBecomeActive
該狀態表示應用程式恢復到前台後剛剛變為活動狀態。這是一種可用於對使用者介面進行額外調整或將 UI 恢復到原始狀態等的方法。這實際上發生在使用者已經在顯示器上看到應用程式的那一刻,因此有必要謹慎確定此方法和前一個方法中會發生什麼事。它們被一個接一個地調用,相差幾毫秒。
5. 應用程式將終止
此狀態發生在應用程式退出前幾毫秒,即應用程式實際終止之前。無論是在多工處理中手動還是在關閉設備時。此方法應用於保存已處理的資料、結束所有活動並刪除不再需要的資料。
6. 應用程式DidReceiveMemoryWarning
這是討論最多的最後一個狀態。如果應用程式不必要地使用了系統資源,它負責在必要時從 iOS 記憶體中刪除該應用程式。我不知道iOS對後台應用程式做了什麼,但如果它需要一個應用程式向其他進程釋放資源,它會提示它釋放它擁有的任何資源,並發出記憶體警告。所以在應用程式中呼叫這個方法。開發人員應該實現它,以便應用程式放棄已分配的內存,保存正在進行的所有內容,從內存中清除不必要的數據,並以其他方式充分釋放內存。確實,許多開發人員,甚至是初學者,都沒有考慮或理解這些事情,然後他們的應用程式可能會威脅電池壽命和/或不必要地消耗系統資源,即使在後台也是如此。
判決書
這六種狀態及其相關方法是iOS中所有「多任務」的背景。這是一個很棒的系統,只要開發人員不忽視這樣一個事實,即需要對應用程式在用戶設備上拋出的內容(如果用戶被最小化或收到系統警告等)負責。
來源: Macworld.com
作者: 雅庫布·波札雷克、馬丁·杜貝克 (ArnieX)
您是否也有問題需要解決?您需要建議或尋找合適的應用程式嗎?請隨時透過 部分中的表格與我們聯繫 輔導,下次我們會回答您的問題。
你好,非常酷的文章,但我不知道你是否有任何技術支援。因為我在晚上睡覺前解決過幾次電池問題,而且碰巧在關閉wifi和行動數據的情況下,比另一個情況下關閉wifi且只有3G花費的時間還要多。
不幸的是,經驗是,在iOS中,應用程式必須手動關閉,系統不再像以前那樣運作。
我將 iPhone 更換為 Windows Phone(三星 Omnia W for 6200,-),系統速度達到了完全不同的水平。
恐怕當 Windows 8 Metro 平板電腦問世時,我也會更換 iPad...
@007 – 是的,如果你將舊的 iPhone3G 與新的 WP 進行比較,那麼是的(誰會想到這一點?) WP 會快很多。否則,關於卡盧卡的八卦對你來說並不合適,比較目前的硬體是合適的。我也買了WP7,最後買了4s,代表與WP7完全不同的可用性等級。因此,愉快地、無休止地滾動瀏覽磁磚。
我完全同意帕哈的觀點
我會再次從另一個桶的碎片中做出貢獻 - 三星 Galaxy S 和 iPhone 4 - 我會說在年齡方面具有可比性?在 iOS 4 時代,在 Android 以外的地方的可用性和速度方面,Apple 已經很好地解決了與應用程式一起工作的概念,但對於 Android 來說,情況已不再如此。最後,我還是選擇了4S,我沒有任何抱怨,因為「它就是有效」..而且它工作得很快!
理論是美麗的...但在實踐中,我仍然關閉了酒吧中的應用程式;)
謝謝,很有趣,務實,有趣,不缺乏搖擺性和深度。顯著凸顯了當今年輕人對這個禁忌品牌的迷戀!但感謝她,也感謝這篇文章。
這篇文章完全錯誤。
如錯誤所述,按下“主頁”按鈕時,應用程式不會退出,而是暫停。 IE。絕對不要從記憶體中刪除,也不要退出。只要暫停運行,iOS 就會給這個應用程式 0% 的 CPU 時間。正如文章中所述,它絕對不會「交換」iDevice 記憶體中的任何位置。這真的要歸功於可以使用應用程式切換的事實。
當手機沒有足夠的記憶體來運行具有更高優先順序的其他應用程式(通常是另一個應用程式在前台運行)時,該應用程式將從記憶體中刪除。
在第一種情況下,你是對的,這是翻譯錯誤。至於交換,我們這裡不討論這個,我們討論的是操作內存,而不是iOS設備中的儲存空間。
應用程式的映像會在記憶體中儲存一個有限的時間,直到透過命令再次呼叫為止(請參閱 13,7 GB 中的 16 GB:2,3 GB 保留給系統和掛起的應用程式)
因此,有必要區分諸如導航、Skype等應用程序,這些應用程式即使在後台仍然保持活動狀態,或者某個功能不會結束並繼續,例如發送有關其位置的數據或位置資訊。或像 Vokul 在 pord 模式下監聽,多工處理仍在後台監聽。
這些應用程式會耗盡電池電量,因此需要手動關閉它們,而不是等待 iOS。對於其他的則沒有必要,只有在應用程式崩潰的情況下才需要。
我不能同意這篇文章。分鐘。在第一代 iPad (iOS 1) 上,可以清楚地看到多任務欄中是否有很多「開啟」的應用程序,或者只有幾個。 iOS 確實嘗試清理內存,但這顯然還不夠——RAM 的尺寸太小可能是其最大的弱點。
所以這很大程度上取決於所使用的系統和硬件,很合邏輯的是,在裝有 iOS 1 的 iPad 5.0.1 上,它會比在第二代 iPad 上更糟糕
抱歉,夥計,這是對其理想工作方式的描述。不幸的是,現實完全不同,如果你使用蘋果產品你就會知道這一點,至少和我一樣(即偶爾)。
“你經常會聽到一些迷信,認為 iOS 中後台運行的應用程式會填滿操作內存。”
這不是迷信,這只是事實。畢竟,您自己在文章中聲明了這一點。
“正如我之前提到的,用戶永遠不需要關閉後台運行的應用程式。”
廢話。這只是廢話,蘋果的宣傳,別生我的氣。
「但你不必這樣做,因為 iOS 會為你做這件事。如果你在後台暫停了一個要求較高的應用程序,例如使用大量 RAM 的遊戲,iOS 會在必要時自動將其從內存中刪除,然後你可以通過點擊應用程序圖標來重新啟動它。”
不對。情況有些不同。一個典型的例子——我在後台運行要求很高的應用程序,我需要遊戲。我啟動瀏覽器,打開幾個選項卡 -> 需要更多記憶體。會發生什麼事?我在後台保留要求較高的應用程序,相反,瀏覽器本身會崩潰。如果我手動關閉要求較高的應用程序,瀏覽器可以長時間工作而不會出現任何問題。
這是實踐,而不是理論。令我驚訝的是,作為蘋果產品的長期用戶,你仍然不知道這一點。
謝謝,這描述得很好並且解釋得很好。你幫了我很多;-)♥
首先,我既不支援也不反對iOS,就像Android 一樣,但這裡有一些奇怪的事情,如果像這裡寫的那樣:“你很少在iOS 上遇到應用程式崩潰”,那麼在Android 上應用程序崩潰大約每年一次:-P
http://dotekomanie.blog.mobilmania.cz/2012/02/stabilita-ios-vs-android/
是的,但是需要手動關閉應用程式的情況確實很少,我大約用過一次? ;-) 給出 Mobilemania 的比較測試連結是毫無意義的,當我想了解 Google 付費的廣告時,我會看一下那裡 ;-) 每個人都可以拿到手中的任何 Android 手機,並且它不會乾淨地運行,也就是說,除了Galaxy Nexus 之外,它的系統或多或少是定制的。總的來說,android 是一場災難
@Mek – 我每天都使用蘋果產品好幾年了,這從來沒有發生在我身上,所以你的理論在某種程度上不起作用。
OT:
@redakce – 可以看出網站正在不斷地開發或正在發生一些事情,但我有一種感覺,不需要一周的時間就能讓一切正常工作。我真的不再來這裡了,因為新的面貌不適合我。至少我在 iPhone 上使用過行動版,但現在根本無法使用 - 這是怎麼回事?他們目前沒有回覆評論中的貼文。
@SteveJSF 不幸的是,事情並不總是按照我們希望的方式發展。至於答案,新的 SEO 外掛程式打破了它們,目前正在解決。
WP-Touch 也因某種原因終止了我們的服務,因此我們決定提出比該外掛程式更好的解決方案。所以你可以期待下一個訊息很快:-)
好文章。就實踐而言,我想說我同意幾件事,並且大多數情況下它都按規定工作,但不幸的是仍然存在編寫得不好的應用程序,其行為不正確,然後有像這樣的情況一些讀者註意到。我認為 Skype 是一個很好的例子,我從實踐中知道它仍然在後台運行(這很好,應該如此),但問題是這個應用程式會大量消耗設備的電池,並且我已經看不清了。相反,Facebook、Badoo 等應用程式。它們仍然在後台運行,但它們的消耗幾乎難以察覺(至少我沒有註意到)。所以我認為錯誤在於個別應用程式。如果您知道哪些,則只需手動關閉那些就足夠了!
因此,慣例是 Facebook 根據需要運行,而 Skype 僅在需要時運行。
好吧,另一方面,如果我需要節省電池,並且我知道我必須盡可能長時間地保持iPhone“活著”,我也會關閉多任務處理中所有不必要的內容,但大多數情況下它不會產生太大的影響,但如果有必要,我會限制3G、所有行動互聯網、WiFi、位置服務、飛行模式、照明強度等。作為日常工作的一部分,我還會在多任務處理中關閉上述應用程式.
因此,我個人認為這篇文章是正確的,不幸的是,一些程式設計師用他們的應用程式反駁了這些事情,因為他們的應用程式是不正確的,在我看來,對此只有兩種解決方案1. 如果可能不使用該應用程式並找到一個如果可能的話,採用替代方案,或者2. 如果不可能,請參見例如Skype,將其寫給報告中的給定程式設計師,並希望他們對此採取措施。
手動停用應用程式可能毫無意義,但我還是這麼做了。我也嘗試不關閉應用程式系統,讓它們運行(或讓它們在後台休眠),電池壽命要低得多,我還不得不在大約三週後重新啟動iPad 2,它響應緩慢。所以我手動關閉應用程序,電池持續時間更長,我最近在聖誕節重新啟動,它運行良好。
順便說一句,我在 Mac OS X 中做了同樣的事情,我只是關閉我不需要的應用程式(CMD+Q),這比讓它在後台休眠並不必要地消耗 RAM(OS X 可以)要好工作得很好)。我的 RAM 很少,只有 8 GB,但是在 7 GB 的 Windows 8 中,系統響應緩慢或交換,在 OS X 中這是相當常見的現象(我從未關閉計算機,我也用 Mac 這樣做,所以一個月或更長時間的正常運行時間也不例外,問題是我有時必須重新啟動Mac作為預防措施以釋放RAM並“加速”,Windows 7不需要這個)。
我更感興趣的是如何實際爆破應用程式。我遇到的情況是,應用程式(特別是在地理藏寶上)進入了從父伺服器載入某些內容的狀態,並陷入了該狀態。主頁按鈕起作用了,重新啟動後它又回到凍結狀態(我離開的地方)。手動退出(到多任務選單,按住圖示並減號關閉)=應用程式消失,重新啟動後以凍結的原始狀態開啟。所以我關閉了所有內容,關閉手機,打開它,雙擊“主頁”,你瞧,應用程式都在那裡,就像它們在關閉之前關閉之前一樣。重新啟動也無濟於事——保持原位和鞋面直到變熱。唯一有幫助的就是從手機中刪除該應用程序,重新啟動它,然後將其重新安裝在手機上。不知怎的,我沒有接受它。
這種多任務管理是有效的,並且由開發人員來應對這些情況。對於那些有興趣更詳細和專業地描述整個情況的人,我將在這裡寫下它是如何進行的。
應用程式總共可以回應 6 種狀態,這些狀態是:
申請將辭職活躍
應用程式進入後台
應用程式將進入前台
應用程式已變為活動狀態
應用程式將終止
applicationDidReceiveMemoryWarning
現在我將嘗試更詳細地描述這些狀態。
applicationWillResignActive – 此狀態意味著在未來(大約幾毫秒)應用程式將退出活動應用程式(即前台應用程式),例如在使用應用程式時收到呼叫時會發生這種情況,但同時這方法,因此即使在應用程式進入背景之前,此狀態也會觸發,因此您需要考慮這些變更。此方法也適用於,例如,當有來電時,它會暫停正在執行的所有活動,並等待通話結束。
applicationDidEnterBackground - 此狀態表示應用程式已進入後台,開發人員應使用此方法掛起所有不一定需要在背景運行的進程並清理記憶體中未使用的資料和其他進程,例如過期計時器、清除如果應用程式在後台完成連線並不重要,則不一定需要記憶體載入的映像或終止與伺服器的連線。基本上,如果應用程式的某些部分不需要在背景運行,則應使用在應用程式中呼叫此方法來完全掛起應用程式。
applicationWillEnterForeground – 當應用程式將退出到活動狀態時,此狀態與第一個狀態相反。此應用程式狀態僅意味著在接下來的幾毫秒內,睡眠應用程式將從後台恢復並出現在前台(應用程式進入前台),開發人員應使用此方法來恢復應用程式處於非活動狀態時的任何進程。在後台,應重新建立與伺服器的連接,重置計時器,將映像和資料載入到記憶體中,並且可以在使用者再次看到載入的應用程式之前恢復其他必要的進程。
applicationDidBecomeActive – 此狀態表示應用程式恢復到前台後剛剛變為活動狀態,這是一個方法,可用於對使用者介面進行額外的調整或將 UI 恢復到原始狀態等。該方法實際發生當使用者已經可以在顯示器上看到時,因此有必要從資產負債表中確定該方法和先前的方法中發生了什麼。它們被一個接一個地調用,相差幾毫秒。
applicationWillTerminate - 此狀態發生在應用程式終止前幾毫秒,即應用程式實際終止之前。無論是在多工處理中手動還是在關閉設備時。此方法應用於保存已處理的資料並結束所有活動並刪除不再需要的資料。
applicationDidReceiveMemoryWarning - 這是這裡經常討論的條件,如果有必要,iOS 會從記憶體中刪除應用程式(如果它不必要地使用系統資源)。我不知道iOS對後台應用程式做了什麼,但如果它需要一個應用程式向其他進程釋放資源,它會透過記憶體警告提示它釋放它所持有的資源。所以在應用程式中調用該方法,開發人員應該實現它,以便應用程式放棄其擁有的內存,保存已處理的數據並刪除內存中不需要的數據,否則充分釋放內存。確實,許多開發人員(例如初學者)不會考慮這些事情或不理解它們,然後他們的應用程式可能會危及電池壽命和/或不必要地消耗系統資源,即使在後台也是如此。我不知道如果應用程式在收到記憶體警告後不執行任何操作並繼續像以前一樣消耗系統資源,iOS 會如何表現。
這幾個狀態和相關方法是iOS 中整個「多任務處理」的背後......如果開發人員不忽略對應用程式最小化時將在用戶設備上拋出的內容負責,那麼它是一個很棒的系統或從系統中獲取警告等等...
我希望這個簡短的描述可以幫助您了解應用程式如何使一切順利進行。所以幾乎可以說這是用戶錯誤使用的錯誤,這可以理解為——如果你大量使用來自業餘開發者的免費應用程序,你的 iOS 設備將比使用大量應用程序運行得更差。來自經驗豐富或專業開發人員的免費和付費應用程式的數量。這並不是說兩個圈子都沒有例外。例如,foursquare 的行為相當奇怪且要求很高,同時,人們會期望他們是非常熟練的開發人員,在記憶體和電池管理上投入大量時間,但事實恰恰相反。 4SQ最大的問題是與伺服器的通信,經常掛起並且不堪重負。這只是一個例子,即使是知名的應用程式也會出現問題,但這並不能改變4SQ是一項偉大服務的事實。
蘋果玩得開心!! :)
我們在獲得作者許可的情況下將資訊添加到文章中;-)
抱歉,段落之間到處都是 ENTER,他們可以在這裡做一些事情,以便評論至少有一點豐富的文本格式。
ArnieX:感謝您的評論!
法拉米爾:我只是關於你的問題,我不知道這對你的情況是否有幫助,但我從我自己的經驗中知道,如果你關閉應用程式(在多任務處理中),它需要幾秒鐘的時間才能關閉,所以如果您將其關閉,我建議您等待幾秒鐘(我大約等待 10 秒以確保),直到它完全完成,然後我才會再次啟動它。
不客氣;)如果我有機會做出貢獻,我將很樂意提供協助。
Meeb 是怎麼回事,當我透過它登入 ICQ 或 FB 聊天時,它會在 10 分鐘後自動登出,然後我就離線了還是繼續工作?感謝您的澄清:P
十分鐘後,應用程式與 Internet 的連線就會中斷。但是,您仍將在 Meeba 伺服器上在線,如果有人給您寫信,您將收到推播通知。重新打開應用程式後,一會兒就會建立連接,您可以繼續愉快地聊天。
因此,如果我正確理解了您連結的文章,那麼統計數據僅涉及應用程式啟動時的崩潰,這在可能發生崩潰的情況中所佔的比例相當小。因此,在我看來,從這項「研究」中不可能得出iOS不太穩定的結論。此外,摘自《福布斯》的文章的譯者忘記提及,提供應用程式崩潰資料的公司得到了 Google 等公司的支持(「Crittercism,得到了 Google Ventures 的支持…」)。