Windows Phone 7.1 Overview (1) - Executing Model

正名為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

private void Application_Activated(object sender, ActivatedEventArgs e)

{

            if (e.IsApplicationInstancePreserved)

                ((MainPage)RootFrame.Content).ApplicationTitle.Text = "Dormant";

            else

            {

                //restore state in here

                ((MainPage)RootFrame.Content).ApplicationTitle.Text = "Tombstoned";

            }

}

 

 

PS: 在真實的Mango中,使用者也可以透過常按Back按鍵來關閉一個已經Dormant的應用程式,此時該應用程式是直接關閉,而非進入Tombstoned狀態。

另外,要充分體驗Dormant的威力,以下的範例可以協助我們更深入了解。

 

MainPage.xaml.cs

public partial class MainPage : PhoneApplicationPage

    {       

        // Constructor

        public MainPage()

        {

            InitializeComponent();           

        }


        private void button1_Click(object sender, RoutedEventArgs e)

        {

            Thread th = new Thread(a =>

                 {

                     for (int i = 0; i < 10000; i++)

                     {

                         Dispatcher.BeginInvoke(() =>

                             {

                                 button1.Content = i.ToString();

                                 UpdateLayout();                                

                             });

                         System.Threading.Thread.Sleep(1000);

                     }

                 });

            th.Start();

           

        }

    }

在此應用程式執行後按下Button後,待其跑到數字如10時,請按下Home按鍵,接著稍後再按下Back鍵回到應用程式,此時會發現其計數器是由10開始,

這代表著當應用程式進入Dormant狀態時,所有執行緒是被暫停而非移除,這其實與單核心CPU多工的處理手法很像。