2011-12-02
為什麼Android開始使用假多工?
分類:
技術
在iOS與Android的多工機制一文中
提到Android開始使用假多工
這邊將稍微深入探討Android的假多工機制
複習一下:
真多工:佔用記憶體、CPU,程式被強制關閉後無法繼續執行
假多工:不佔用記憶體、CPU,程式被關閉時暫停,或將任務交由其他人代為執行
凍結
在傳統的Android系統上,應用程式切換到背景的時候,會記錄應用程式當下的狀態,除非記憶體夠大,否則這些背景程式會很快地被強制結束,釋放資源,當使用者要求該程式回到前景時,程式會被還原到關閉前記錄的狀態,給使用者一種「程式似乎一直在背景執行的錯覺」。單靠這種機制,背景程式很容易被中斷,並不能正確的持續工作,因此android加入了兩種新機制,推播與服務。
推播
註冊推播的程式在切換到背景時,會被關閉甚至釋放記憶體,直到被「觸發」,推播可分為內部與外部。
外部推播,就是當外部伺服器(msn whatsapp google+ messenger 小熊來電這類.....)發生新事件,android才會「喚醒」那些註冊推播的程式,並給與數十秒的時間處理新事件,然後再度被關閉,因此就算有很多背 景工作也不會消耗記憶體。傳統上,許多應用程序使用輪詢,每隔一段時間下載數據。 如POP mail每15分鐘就會連線到伺服器更新數據。輪詢是非常容易實現的,在許多情況下效果不錯。但問題是,如果更新數據過於頻繁,實際上確沒有新的資訊,會 造成不必要的網路頻寬負載。更新數據頻率太低,設備上的資訊可能過舊。輪詢在移動設備上有很大的問題,因為它佔用寶貴的網絡頻寬和電力。推播是一個更好的 擷取資訊的方法,可以得到更新的資訊且節省電力電池。Android上的許多app已經在使用推播更新數據,例如,Gmail,通訊錄和行事曆。從 Android 2.2開始,C2DM允許第三方程式開發者使用推播。
內部推播(Android上稱之為廣播),也是相同的原理,但引發「觸發」的不是網路上的伺服器,而是其他程式,如timer,一個程式可以註冊換醒時間,像動態桌布就是個例子,藉由不斷的「喚醒」,讓你覺得好像一直在背景運作。
服務
服務可視為「系統常駐程式」,一旦程式註冊自己為服務,即使被切換到背景,也幾乎不會被強制關閉,就算因為資源嚴重不足,系統也會在資源恢復時重新喚醒服務。目前Android系統准許維持背景執行的類型只有「音樂、GPS、VoIP」,而為了讓用戶明確知道服務正在運行,android會在狀態列顯示,以提醒使用者,目前背景有服務正在使用資源,系統並不會自動釋放服務的資源,必須由使用者手動關閉。
寫到這裡,大家一定會覺得很熟悉...
「程式似乎一直在背景執行的錯覺」->這個幾乎就是iOS 4 假多工裡面的「凍結」
「外部推播」->跟iOS 3的推播是相同的機制
「內部推播」->iOS 4的多工出來之前,iOS都是用此方式更新mail、行事曆
「音樂、GPS、VoIP」->這跟iOS4官方允許的背景程序完全相同
所以Android上的這些「機制」其實就是iOS4上的「假多工」
凍結+推播+服務 = 假多工
幾乎95%的程式可以用假多工完美的呈現,一般人根本無從察覺
假多工省電、省記憶體、省運算資源,而且資訊的反應速度甚至比真多工好!
這也是為什麼Google積極的導入這些技術的原因,因為真多工在行動裝置上是「該被淘汰的老舊技術」了
也難怪有人說iPhone對世界的貢獻之一就是帶來「新的多工技術」
iOS禁止真多工的運行,只允許假多工
而Android有真多工也有假多工,除了背景凍結外,Android開發團隊鼓勵應用程式開發者使用推播、服務等技術
現在你知道為什麼Android 2.2以上特別省電的原因了吧?
Multitasking the Android Way
Android Cloud To Device Messaging
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言