正名為Windows Phone 7.1的Mango SDK Beta於5/24日釋出,眾多的新特色令人目不暇給、眼花撩亂,也呈現出了Microsoft奪回行動裝置市場的堅定決心,雖然NoDo的
推送經驗讓人對Windows Phone 7有些許失望,但Mango這記重砲,在其推送之後,想必將會在行動裝置市場投下一顆震憾彈。
Windows Phone 7.1 Overview (1) - Executing Model
文/黃忠成
正名為Windows Phone 7.1的Mango SDK Beta於5/24日釋出,眾多的新特色令人目不暇給、眼花撩亂,也呈現出了Microsoft奪回行動裝置市場的堅定決心,雖然NoDo的
推送經驗讓人對Windows Phone 7有些許失望,但Mango這記重砲,在其推送之後,想必將會在行動裝置市場投下一顆震憾彈。
New Execution Model
為了提供更快的應用程式切換機制,Windows Phone 7.1重新設計了應用程式的執行模型,加入了名為Dormant的機制,圖1是MSDN說明文件上所列示的新應用程式執行模型。
圖1
對於原本就熟悉Windows Phone 7應用程式執行模型的開發者而言,這張圖中唯一值得注意的就是Dormant(擱置)這個狀態,在Windows Phone 7.0中,當使用者於一應用程式執行中按下
Home按鈕、搜尋按鈕、或是進入鎖定畫面時,該應用程式會觸發Deactivated事件,這裡應用程式必須負責將現行狀態存下來,在Deactivated事件完成後,該應用程式便會被關閉並從記憶體中
完全清除,待使用者再次按下Back按鍵或是解除鎖定畫面時,該應用程式會被重新執行並觸發Activated事件,此時應用程式必須負責由Deactivated事件所存下的狀態來還原,此稱為Tombstoned。
Windows Phone 7.1改變了此執行模型,當使用者按下Home按鈕時,其雖然仍會觸發Deactivated事件,但在該事件之後,應用程式便會進入Dormant,也就是擱置的狀態,簡單的說,此時應用程式
雖然已經不再執行(所有執行緒及行程都處於暫止狀態),但其還是存在記憶體中,當使用者再次按下Back按鍵,該應用程式會由暫止狀態恢復並觸發Activated事件後,由上次暫停的地方繼續執行,
因為省略了終止應用程式及重新啟動應用程式的步驟,所以切換應用程式的速度將會變得非常迅速。在真實的Mango中,使用者可以按住Back按鍵不放來選取要回到哪一個Dormant的應用程式,
但Mango SDK Beta的模擬器中則需要點擊模擬器畫面,然後常按F1來啟動該選單(照目前流出Demo的影片,真實的Mango切換應用程式的效能跟畫面比模擬器好太多了)。
需特別注意的一點是,並不是每次使用者按下開始按鈕就會令應用程式進入Dormant狀態,應用程式也不會一直處於Dormant狀態,只要系統的記憶體不足,或是新開的應用程式需要記憶體
超出現有記憶體存量,早先已經Dormant的應用程式便會被由記憶體中清除,讓新的應用程式順利啟動,圖2是新的Dormant模型的示意圖。
圖2
那如何辨別程式是由Tombstoned還是Dormant恢復呢?Windows Phone 7.1 SDK 的Activated事件中添加了一個新的屬性: IsApplicationInstancePreserved,當這個屬性為True時,
就代表著應用程式正從Dormant狀態恢復,此時不需要恢復先前應用程式的狀態,因為該應用程式只是暫停,並未由記憶體中清除,所有以建立的物件都還維持在暫停前的狀態。
當IsApplicationInstancePreserved為False時,代表著應用程式是由Tombstoned狀態恢復,此時應用程式必須負責由Deactivated事件保存的應用程式狀態恢復。
簡略的說,Dormant狀態的加入,並不代表開發者不需要在Deactivated中保留現行應用程式狀態已備由Tombstoned恢復時所需,因為OS可以決定應用程式何時進入Tombstoned
或是Dormant,對於開發者而言,Dormant狀態的出現,只代表著應用程式有著另一種快速回到前景的途徑,開發者還是需要遵循原本處理Tombstoned的寫法,下列範例為結合
Tombstoned及Dormant的寫法。
App.xaml.cs |
|
PS: 在真實的Mango中,使用者也可以透過常按Back按鍵來關閉一個已經Dormant的應用程式,此時該應用程式是直接關閉,而非進入Tombstoned狀態。 |
另外,要充分體驗Dormant的威力,以下的範例可以協助我們更深入了解。
MainPage.xaml.cs |
|
在此應用程式執行後按下Button後,待其跑到數字如10時,請按下Home按鍵,接著稍後再按下Back鍵回到應用程式,此時會發現其計數器是由10開始,
這代表著當應用程式進入Dormant狀態時,所有執行緒是被暫停而非移除,這其實與單核心CPU多工的處理手法很像。