所謂的iOS「偽多任務」和Android的多任務處理的區別在哪?


iOS 中程序分五個狀態:活躍,不活躍(鎖屏,但程序不接受事件),運行結束,後台,掛起

特別說一下後台運行跟掛起

後台運行:是指不在界面中顯示,但是代碼還在執行

掛起:程序在內存中,但是代碼不執行

iOS 只允許以下幾種程序長時間在後台運行:

  • Apps that play audible content to the user while in the background, such as a music player app

  • Apps that keep users informed of their location at all times, such as a navigation app

  • Apps that support Voice over Internet Protocol (VoIP)

  • Newsstand apps that need to download and process new content

  • Apps that receive regular updates from external accessories

而其他的程序最多只允許申請十分鐘的後台運行時間,十分鐘一到,就會被系統自動掛起,而在系統內存不足的情況下,才會將掛起程序 Kill 掉;這就最大程度的保證了當前活躍中的程序的系統資源,保證了其流暢性。

而 Android 的多任務則是十個程序在後台,十個程序都在執行代碼,搶佔資源

參考蘋果文檔:https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html


Android 從一開始就是允許後台,用的是 Service 這個組件,意思是就算你的屏幕上應用隱藏/被遮住,Service 依然在跑,而當內存告急的時候,系統才會通過 kill Service 釋放資源。Android 2.0 以前的 Service 有個錯誤的設計是 setforground 方法可以將 Service 設置成前台程序,導致系統就算內存告急也沒法殺掉他(前台應用是優先順序最高的),很多應用濫用這個方法,2.0 的時候這個方法砍掉了沒效果了。Service 配合上 AlarmManager 定時任務可以做到任何事情。

iOS 那邊,最初的設計是這樣的,如果應用不在前台,那麼直接被系統從內存從清理出去,再進一個應用那就是等同於重啟這個應用,所以才有了 Loading Screen 這種設計,當然現在這個設計被濫用成 Splash Screen(就是應用啟動最初的那個開發商/應用的 Logo)。後來,iOS 4 開始,Apple 宣稱擁有了「多任務」,其實這個多任務只是在應用不在前台的時候依然保存在內存而已,在切回去的時候不必重新啟動一次程序,他沒法執行後台任務的。通過開放一些介面給特定的程序(音樂播放),以及推送,盡量偽造出多任務的效果。iOS 的第三方鬧鐘都是殘廢的,就是被 Apple 給限制了。

提下 WP7 得了,WP7 最初也是 iOS 那樣的,後來芒果開始,應用不在前台還是會保留在內存,不過 WP7 保留最多只有5個(或者6個,算上瓦片的話),WP7 只有下載和音樂播放是可以後台的,差不多跟 iOS 一樣。需要注意的是瓦片/列表啟動程序是直接重啟,不管這個應用有沒在內存里了,長按 Back 才是切換應用。

至於說電池問題,Galaxy Nexus 一個晚上開 Wifi 只掉 5% 的電,耗電大戶是屏幕,裝的應用200左右。iPhone4s 比 iPhone4 只變動了 CPU 就變成了電老虎……


推薦閱讀:

為什麼 Android L 不在多任務切換界面中提供「一鍵移除所有卡片」的功能?
有 15 寸 rMBP 和 iPad 4 ,手機該選 Android 還是 iPhone?
手機續航能力由哪些因素決定?
安卓中有沒有可懸浮可透明的輸入法?
作為大陸用戶,我們錯過了Android 的什麼?

TAG:iOS | Android開發 | 多任務 | Android | ApplePushNotificationService |