實驗 5 : 處理程序週期管理( Process Lifetime Management )
概述
對正在建立 Windows 市集應用程式的開發人員來說,處理程序週期管理( Process Lifetime Management ,簡稱 PLM )是很重要的概念之一。傳統的桌面應用程式縱使處在背景仍然會繼續執行( execute )工作;可是, Windows 市集應用程式就完全不同,它必須處在前台,才會執行工作。(請注意:被貼齊的應用程式算是處於前台。)在一般情況下,使用者看不見的應用程式就是被作業系統所暫停而無法執行工作者;想讓它恢復運作,唯有等到 OS 將它恢復到前台來。
當應用程式被暫停時,它仍然保留在記憶體中,只是所有的執行緒( threads )都被暫停而已。只要處理程序保留在記憶體裡,一回到前台的應用程式就會從先前離開處來恢復執行( executing )工作。這一點完全不用您(開發人員)操心。但是,我們無法向您保證您的處理程序一定會被留在記憶體裡,因為在應用程式被暫停期間,倘若 Windows 判斷它需要使用該暫停應用程式所佔用的記憶體,那麼, Windows 就會終止( terminate )該暫停中的應用程式。如果這種情況發生,所有未經儲存的狀態就會消失,除非您採取保存該狀態的措施。否則,在使用者換回前一個應用程式卻找不到剛完成的所有工作時,他或她鐵定會嚇一大跳。
我們當然不允許這種情況發生。在應用程式被暫停時,甚至是 Windows 也不知道此應用程式是否會被終止( terminate ),所以,您必須假設您的應用程式會被終止,也因此寫程式碼來儲存應用程式被暫停時的狀態。這麼一來,縱使您察覺暫停中的應用程式被終止,您還可以恢復它先前的工作狀態。
聽起來很棘手?有時候的確如此。還好,大多數的應用程式不會這麼糟糕。但是,話說回來,寫出好用偉大的應用程式本來就是您的工作。如果您不這麼做,其代價可能是使用者在您的應用程式上剛完成的工作,卻在切換到另一個應用程式的短暫時間裡消失得一乾二淨。
目標
本實驗將介紹您認識 PLM 並展現 Visual Studio 為您寫的一些預設範本的程式碼。因為 Contoso 食譜只是一支小小的應用程式,我們沒有必要寫新的程式碼來處理 PLM ; Visual Studio 所注入的程式碼已經足夠。但是,您可能要為自己的應用程式寫比較多的程式碼,所以,在需要寫程式碼的地方,我們一定會帶著您從頭到尾走一遭並告訴您有哪些 API 可以使用。所以,暫且坐下來休息一下吧,不過,要集中精神,全神貫注喔!
系統需求
要完成本實驗,您必須擁有下列東西:
Windows 8
Microsoft Visual Studio 2012
設定
為了讓您的電腦能進行本實驗,您必須先執行下列步驟:
安裝 Windows 8。
安裝 Microsoft Visual Studio 2012 。
練習
本動手做實驗室包含下列練習:
為您儲存瀏覽狀態
提示
完成本實驗,估計需要費時: 30 到 40 分鐘。
練習 1 : 為您儲存瀏覽狀態
因為唯一需要儲存在 Contoso 食譜裡的狀態是瀏覽狀態 – 也就是,使用者正在查看的項目或群組和瀏覽的歷史記錄 – 所以,您不用去處理 PLM , Visual Studio 已將這一行程式碼包含在 default.js 裡的 app.oncheckpoint 處理常式中,而且將瀏覽狀態序列化( serialize )成工作階段( session )狀態。
JavaScript
app.sessionState.history = nav.history;
此 sessionState 屬性是一個屬性包容器,在這兒,您可以擺放任何當應用程式即將被暫停時,適用於 JavaScript 的 Windows Library ( WinJS )自動序列化的物件。當暫停事件被觸發時, WinJS 就會自動呼叫 oncheckpoint 。
Visual Studio 也包括下列程式碼於被啟動的事件處理常式,以便在作業系統終止( terminate )被暫停的應用程式之後,您還能恢復它先前的瀏覽狀態。
JavaScript
if (app.sessionState.history)
{
nav.history = app.sessionState.history;
}
其結果是您得到許多免費的服務。如果 Contoso 食譜被暫停和終止( terminate ),在您下一次重新啟動它時,它會自動回到您最後正在查看的頁面。您可以做一下測試,請按壓 F5 ,從 Visual Studio 裡啟動此應用程式、選擇任一食譜配方、並從偵錯位置工具列裡選擇暫止並關閉( Suspend and shutdown ),如這兒所顯示。
.jpg)
以這種方法關閉應用程式後,請按壓 F5 來重新啟動應用程式。這模擬了應用程式被作業系統所終止( terminate )和重新啟動的情形。由於 Visual Studio 已創建了程式碼,應用程式會回到您上次正在查看的食譜配方。因為瀏覽的歷史記錄也被恢復,您甚至可以使用返回( Back )按鈕來回顧應用程式所走過的步驟。
練習 2 :提示
我們強烈建議您先熟悉 Visual Studio 裡的暫止( Suspend )、繼續( Resume )、和**暫止並關閉( Suspend and shutdown )等命令。這是為應用程式的 PLM 狀態偵錯的好方法。如果您以「啟動」應用程式和「工作切換」來偵錯 PLM ,以使應用程式移入和移出前台,大部份的時候您應該都可以得到很好的結果。但是,「終止」的行為就不見得正確;您會發現應用程式停留在記憶體裡的時間比較長,這是因為 Visual Studio 偵錯器施作了一些魔法來與應用程式保持連接。要終止它,請使用 Visual Studio 裡的暫止並關閉( Suspend and shutdown )**命令。
決定為了 PLM 儲存什麼也很重要。在下一個實驗裡,我們將討論設定( Settings )(或使用者偏好)。請注意:為了 PLM 我們將只儲存使用者在應用程式裡最後輸入或變更的少數幾個東西;您所儲存的 PLM 狀態應該都是一些「過渡」狀態,純粹只為了幫助使用者恢復到應用程式被暫停之前的狀態而已。其它任何需要儲存的東西(例如,設定或快取( cache ))應該是一有需要就儘早儲存起來。這樣做,在發生 PLM 暫停事件時,您才能大幅減少工作量。
摘要
處理 PLM 的**暫停( Suspend )和恢復( Resume )**事件是好的 Windows 市集應用程式的必備條件之一。在本 Contoso 食譜實驗裡,我們沒有在這方面做太多事,因為我們只是單純儲存瀏覽歷史記錄而已。如果您是寫作自己的應用程式,您或許需要在這方面多費一點心、多做一些事。本實驗剛介紹完 Visual Studio 所生成的程式碼和 PLM 的 WinJS 之基礎結構,接下來,還有很多事需要做。下一個實驗將是使用設定常用工具列來儲存使用者偏好,且讓我們繼續。
| 繼續下一個實驗 |