理解
Windows Phone
7應用程式執行模型,墓碑機制,啟動器和選取器及更多內容
——Part 1
作者:
Yochay Kiriaty
本系列的文章起了一個如此長並十分響亮的名字,相信會很不錯,當然這要由你來評判。然而,起這麼長名字的原因很簡單, 這些“大”詞可以簡要的概括執行模型的各個方面。如果你想不斷提高應用程式的使用者體驗那麼你就該弄懂它們。本文通過啟動、運行和關閉一個Silverlight 應用程式的不同方面來逐步向你介紹Windows Phone (WP) 應用程式的執行模型。注意:對於XNA 遊戲來說,這些術語和概念是一致的,只是有些實現上的微小差異。在後面的文章中我將介紹停用(deactivation ),重新啟用(reactivation )以及啟動器(launcher )和選取器(chooser )如何通過墓碑機制來工作。
隨著最新的Beta 版Windows Phone 開發人員工具的發布,在Windows Phone 上執行的應用程式採用了更新的執行模型。現在,當你的應用程式從前台被移除時(另一個應用程式佔據前台,如電話呼入或者螢幕鎖定被啟用),實際上它會被終止掉(在不久之後)。在Windows Phone 工具的早先版本中,如果你從一個應用程式切換到另一個應用,可能會碰到各種各樣奇怪的情況。這是因為在原先版本的工具中,Windows Phone 作業系統並沒有徹底終止你的程式,而是將它“暫停”了。但現在問題來了,是啟動一個應用程式的新執行個體還是經由回退棧返回到原來的程式呢?更令人困惑的是,這些相關的事件和API 還不夠完善。我想這正是我們看到技術預覽版的原因——測試並修複這些“問題”。
基本規則
確保只有一個程式。到目前為止你也許已經知道Windows Phone 作業系統不允許第三方應用程式在後台運行。說的更具體些,就是在任何時間內只有一個應用程式能運行在前台,這意味如果你的應用程式沒有在前台顯示,那它就沒有運行。不允許第三方應用程式在後台執行的最主要原因是為了維持電池的續航時間(參見 推播通知服務
)並確保提供一個能夠快速響應並且一致的使用者體驗。
所有Windows Phone 裝置都配備了一個返回按鈕硬體。這個按鈕除了有返回導航功能之外,還將支援應用程式之間的切換。這是一個非常酷的特性,不同於其他類型的手機,你可以從一 個應用程式導航至瀏覽器或者是另一個應用程式,然後再按下返回按鈕便可流暢地回到你的應用程式。這將會在不同的應用程式上獲得一個十分統一的使用者體驗,不 論是第三方應用程式還是手機內建的應用程式套件。這意味著Windows Phone 作業系統為你應用程式的行為維護了一個目錄從而來支援返回按鈕的功能。這就是回退棧
。
基礎——啟動,執行和關閉應用程式
是時候來看看Windows Phone 的執行模型了,對此最好的方式莫過於研究代碼了。現在開啟一個新的Windows Phone 應用程式並查看Windows Phone Silverlight 應 用程式模板自動產生的程式碼,你可以在App.xaml.cs
檔案中找到4 個與執行模型直接相關的方法:
- Application_Launching
- Application_Activated
- Application_Deactivated
- Application_Closing
順便說一下,所有這些事件(這些方法是事件處理常式)都是Microsoft.Phone.Shell
命名空間中PhoneApplicationService
類的成員。
我認為這些方法的名字已經完全可以自我解釋了,但為了保險起見,讓我來說明一下。我將在後面講Activated 和Deactivated 事件;現在,來看兩個簡單的事件:Launching 和Closing 事件。我為每個方法(事件處理常式)添加了如下的一行代碼:
// Step 1 - Util is helper class for logging<br />Util.Trace("***** in MainPage CTOR/t/t ( " + DateTime.Now.Ticks + " *****) ");
Util
是一個簡單的有助於我們調試的輔助類。每個方法中的文字是根據事件而變化的,但你也可以自訂。我記下了每個事件發生的時間以便在後面說道Activated 和Deactivated 事件時用以證明。
在目前狀態下執行程式可以得到預期的結果。應用程式一啟動“Launching” 方法就被調用了。不出所料,此事件發生後,程式開始執行了。按下返回按鈕(不是Windows 按鈕)程式就終止了並且“Closing” 事件被觸發。正如所示(截取自Visual Studio 的輸出視窗)。
如我所述,通過按下返回按鈕,導航模型允許使用者“回到上一步”,或者回到前一個的程式頁面,或者切換應用程式。然而一旦你回到了程式的第一頁(第一個頁面,或者程式的第一個執行個體)時按下返回按鈕會觸發Closing
事件並終止此程式。從可以清楚地看到,“程式”已經退出。如果你按本文所述在Visual Studio 中調試代碼,你會注意到在模擬器中程式退出了並返回到了起始介面。
理解Activated
、Deactivated
事件和墓碑機制
到目前為止一切順利,我的意思是還沒有新的內容。現在,讓我們來看看接下來的內容。在Visual Studio 的偵錯模式下執行你的程式(我們可以看到堆棧資訊)。程式如預期的那樣執行同時你會在日誌中看到應用程式啟動的跟蹤資訊。現在不按返回按鈕(如果你按了,程式將被終止),而是按Windows 按鈕(中間的按鈕)。
注意下面幾點:
- 模擬器返回到起始介面的同時你的應用程式從前台消失了,這意味著它不再運行了!
- Visual Studio 中的偵錯工作階段被終止掉。這說明Visual Studio 不再偵錯工具,因為程式已經停止運行了。
注意:
最終,你的程式終止了。我們很容易在Visual Studio 輸出視窗中看到,正如輸出視窗中狀態的最後一行,“The program '[220921918] taskhost.exe: Managed' has exited
with code 0 (0x0).
” 不過別擔心,這種設計是有意為之。不同於前面的例子,這次在Launching 事件後面觸發的是Deactivated,
而不是Closing
。不過無論是那種情況應用程式最終都會被終止。究竟發生了什麼呢?Closing 和Deactivated 的區別是什嗎?更重要的是, 為什麼會有這種差別?
- 應用程式關閉
(Application Closing
)
是使用者多次按下返回按鈕後導航至程式最初頁面後的結果。現在,這是使用者退出一個應用程式的唯一
途徑。一旦應用程式關閉後,它所關聯的進程便會被終止,作業系統會從記憶體(RAM )中移除掉此程式的所有資訊。
- 應用程式停用(Application Deactivated
)
發生在當另一個不同的應用程式擷取了前台控制權時——例如,一個來電,啟動選取器,或者使用者按下了Windows 按鈕。在這些情況下,你的應用程式都將被停用(不是關閉
)。在探討Deactivated 事件的妙處之前,我們要確保已經理解一旦停用,程式最終將會被終止。很簡單:你的代碼不能在後台執行,所以程式會終止執行。然而這和程式的退出不同,一個被停用的程式會被墓碑化處理。注意不要搞混了,一個墓碑化的應用程式它的進程已經終止。但不同於已退出的應用程式,Windows Phone 作業系統會清除它所有的堆棧資訊。但應用程式停用後,Windows Phone 作業系統儲存了應用程式目前狀態的記錄(墓碑)。通常,Windows Phone 作業系統維護的墓碑會成為手機應用程式回退棧的一部分,回退棧就是一個能增強返回按鈕導航功能的記錄。
應用程式可以通過下面幾種方式被墓碑化處理。如果以下情況發生,一個應用程式將被墓碑化處理並且並被停用:
- 使用者按下Windows 按鈕(正如你所做的)。
- 裝置逾時導致螢幕鎖定(還有,另一個應用程式接管了前台的控制權)。
- 使用者調用了啟動器或選取器——我們會在後面的文章中介紹。
在 應用程式生命週期的當前點(就是你的程式被墓碑化處理時),我們就可以執行一些操作了。使用者可以返回到一個墓碑化的程式。如果使用者執行了選取器和啟動器動的行為並返回應用程式時這就會發生,或者如果使用者多次按返回鍵從而返回到一個已停用(被墓碑化處理)的應用程式。不論使用者如何返回到此程式,程式都將被重新啟用(觸發Activated 事件)並且魔術般的顯示出在停用前使用者所瀏覽的最後一個頁面。
如果你不信,讓我們來試試。我在基本的Windows Phone Silverlight 應用程式上又加了一個頁面,並跟蹤每個頁面的建構函式。然後,我在第一頁添加了一個導航到第二頁的按鈕。
在Visual Studio 中,開始調試你的程式並點擊按鈕導航到第二頁。在第二頁中,按下Windows 按鈕。如你所料,程式被停用並終止運行了,正如你在下面的Visual Studio 輸出視窗中看到的。
注意跟蹤資訊的順序(和相應的時間代碼)。首先是程式啟動,然後首頁面建構函式被調用,並且在按下第一個頁面上的按鈕後,程式導航到第二個頁面(詳情頁面),在你按下Windows 按鈕後觸發了Deactivated 事件,這表明應用程式以被墓碑化處理了。
在後面的文章中你將學習返回到一個被墓碑化處理的應用程式和如何在墓碑中管理應用程式的狀態資訊。
範例程式碼可以 在此下載
此下載。
Windows Phone 7 開發人員訓練套件
包含了一個專門對於 Windows Phone 應用程式生命週期
的完整的實驗。
MSDN 文檔中還包含一個主題Windows Phone 執行模型概述
。
查看原文。
翻譯本文目的為學習交流,著作權為原作者所有。