Windows Phone 7 - 簡介新運作模式 - Dormant

Windows Phone 7 - 簡介新運作模式 - Dormant

還記得WP7的App生命週期嗎?在去年撰寫過<Windows Phone 7 – 儲存目前Application狀態的主要方法>這篇時,

解釋了相關WP7運作的主要幾個重要的階段:launching event、deactivated event、active event與closing event,

這些階段的運作是目前每一個WP7 App運作的基本模式,也就代表每一個App都會在這四個階段完成他的生命,

最多只會在deactived event與active event二個階段重覆幾次,也沒有辦法像其他平台那樣,程式只是暫存並非結束

 

但是呢,到了WP7的Mango更新後,將開始支援App運作多了一個暫停的新模式,讓程式執行時,如果遇到用戶按下

start或接到其他外來事件時,可以讓目前操作的App不是直接進入了deactived event,而且進入了一個新的模式:

Dormant State」。

 

以下將介紹Dormant State的運作模式:

〉New Application Life Cycle

在說明新的Application Life Cycle之前,先把目前Windows Phone 7.0的Application Life Cycle拿出來看一下,

可以更清楚看到WP7.1之後增加Dormant State後的新演進:

(A) WP7 Application Life Cycle

     03

    主要有幾種運作的方式:

    (1) 「Launching Event」=>「Closing Event」

           這是最一般的執行方式,當用戶選擇App,該App就從Launching Event開始直到離開程式(透過Back或被自動關掉);

    (2) 「Launching Event」=>「Deactivated Event」=>「Activated Event」=>「Closing Event」

          從App進入Launching後,當用戶按下Start鍵或中間有其他App的插入時App將先進入Deactivated,然而進入Deactivated,

          代表目前App上要暫存的資料將會被寫入至Isolated Storage之中,直到用戶又回到該App時,則進入Activated階段把資料取回來,

          再操作完App進入Closing Event。

 

WP7的Application Life Cycle主要在Deactivated階段將要保存的資料寫入至Isolated Storage之中,等到App又回來準備執行時,

從Isolated Storage中取回資料相對於從Memory中取回資料相比,透過Memory是相對快比較多的;再加上App進入Deactivated後,

其App是被關掉進入tombstoning,App是無法運作的。

因此,到了WP7.1開始,新的Life Cycle多增加了「Dormnat State」,讓App暫停並且可以快速的恢復回來進行運作。

 

(B) WP7.1 Application Life Cycle (*Dormant State)

新的App生命週期如同下:

    http://msdn.microsoft.com/en-us/library/ff817008(v=VS.92).aspx

如上圖的說明,可以看出當App剛進入時會先觸發「Page OnNavigatedTo Method」事件,其OnNavigatedTo事件代表的就是

App在Page進入時所觸發的事件,因此,當App因用戶觸發Start鍵或其他App插入時,會觸發「OnNavigatedFrom」事件,讓App

進入Deactiviated Event,接下來進入「Dormant(休眠)」

進入「Dormant」後,App可以透過用戶按下「Back鍵一段時間」後出現程式切換的畫面,此時的App正是在Dormant的階段,

除非過了一段時間沒有處理或是系統覺得記憶體空間不夠,App才會進入Tombstoned,不然直接又從程式切換中轉換回App時,

將會直接進行Activated Event。

 

(a) 加上Dormant後,程式要如何識別何時為Dormant或Tombstoned

    針對如何識別當App重新被啟動時,是來自於Dormant狀態的轉回還是Tombstoned狀態復原,MSDN提供了一個識別的屬性:

    「IsApplicationInstancePreserved」。該屬性的用法出現在Application Activated Event中,它是一個boolean,識別值定義:

    ‧true:代表App由Dormant狀態轉回,所以App中的畫面、建立的物件與圖示,全都在暫停的狀態不用重新產生;

    ‧false:代表App由Tomstoned狀態轉回,所有的物件與畫面元件,需配合Deactived中暫存的資料重新復原App的使用;

   1: // Code to execute when the application is activated (brought to foreground)
   2: // This code will not execute when the application is first launched
   3: private void Application_Activated(object sender, ActivatedEventArgs e)
   4: {
   5:     if (e.IsApplicationInstancePreserved == true)
   6:     {
   7:         //代表是Dormant
   8:         RootFrame.Dispatcher.BeginInvoke(() =>
   9:             {
  10:                 MessageBox.Show("Dormant");
  11:             });
  12:     }
  13:     else
  14:     {
  15:         //代表是重新整個啟動
  16:         RootFrame.Dispatcher.BeginInvoke(() =>
  17:         {
  18:             MessageBox.Show("Restore");
  19:         });
  20:     }
  21: }

(b) Dormant的好處,暫存目前的執行內容,等回到現況時,繼續執行

     針對Dormant執行時暫存的結果,可以參考<Windows Phone 7.1 Overview (1) - Executing Model>所提供的範例我覺得蠻有感覺。

     通常這個時候的東西,也可以搭配Web Browser的執行來運作。

 

(c) 使用Dormant回到App執行時,與Tombstoned相似,一樣要透過Actived Event,因此,要儲存的項目都要記得存

     在WP7提供多種儲存的機制,可以透過Isolated Storage、PhoneApplicationService.Current.State、User Setting等,這

     些機制都可以讓我將Dormnat或Tombstoned狀態中的畫面資訊給保存下來,讓下一次App重新恢復執行時,可以載入當前的資料內容。

 

======

Mango之後的WP7,我覺得針對Dormant State的支援,的確可以讓應用程式在切換過程中加快其速度,

其主要是透過記憶體暫存的機制來輔助快速切換的效果。因此,可以發現到當我們開很多程式時,例如:

大約開五個程式之後,當你按下第六個時,第一個程式將會直接進入tombstoning,其內容將被暫寫回Isolated Storage中。

所以可想而知其開啟的程式還是有限的不像過去Windows Mobile年代那樣,不過這樣是好的,因為可以

確保應用程式都可以在可執行的記憶體容量內進行穩定的運用。

 

References:

Windows Phone 7.1 Overview (1) - Executing Model (必讀)

Execution Model Overview for Windows Phone

Execution Model Sample

From Tombstoning to Fast Application Switching

Multitasking for Windows Phone

Windows Phone 7.1 Overview (1) - Executing Model (必讀)

Windows Phone 7 培训总结

Multitasking In The Next Version of Windows Phone (重要,ppt)

Windows Phone 7 (Mango) Tutorial - 7 - know about Application Lifecycle (必讀)

 

Dotblogs Tags: ,