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:
主要有幾種運作的方式:
(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生命週期如同下:
如上圖的說明,可以看出當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
‧From Tombstoning to Fast Application Switching
‧Multitasking for Windows Phone
‧Windows Phone 7.1 Overview (1) - Executing Model (必讀)
‧Multitasking In The Next Version of Windows Phone (重要,ppt)
‧Windows Phone 7 (Mango) Tutorial - 7 - know about Application Lifecycle (必讀)