2012年11月30日 星期五

Windows Phone 快速回復

Windows Phone 8 SDK 上新增了一個名為 Fast App Resume 的功能,這個功能主要是開放由開發者決定「當在用戶從動態磚點選已開啟的應用程式時」應用程式要重新開啟一個新的實體或回復原本狀態的方法,在 MSDN 上面有範例可以參考:Fast app resume backstack sample
此篇簡單的記錄一下這個範例的重點,

首先注意到 System.Windows.Navigation.NavigationMode 這個列舉值,除了 WP 7.0 SDK 原本的 New、Back、Forward 之外,還多了新的 Refresh 與 Reset,再來注意到 WMAppManifest.xml 檔案也有一點不一樣。

先提一下觀念,預設應用程式的 ActivationPolicy 為 Replace,而在預設的情況下,應用程式的 RootFrame 在頁面間導覽時,原則上與 WP 7.5 一樣。導覽至新的一頁時,包括按 Home 由應用程式進入系統首頁、或由系統到應用程式時的 Mode 皆為 New,而使用 GoBack() 回到在 Stack 中的一頁時 Mode 為 Back,反之 Forward 規則亦同,可以觀察範例中 RootFrame_Navigating 的 NavigatingCancelEventArgs 參數即可了解。

在這個範例中特別將 ActivationPolicy 指定為 Resume,而在當 ActivationPolicy 設為 Resume 時大致上導覽行為是一樣的,但是在應用程式處於 Suspended 狀態下,再開啟應用程式會先收到一次 Mode 為 Reset 且 Uri 為剛才離開應用程式的 Page 導覽事件,之後才又立刻收到一個原本就會出現的 Mode 為 New 且 Uri 為應用程式首頁的導覽事件,這個範例就是在收到第一個 Reset 事件時對 wasRelaunched 這個 Boolean 值動手腳。

可以在 RootFrame_Navigating 中發現,當收到 Mode 為 Reset 的事件時,將 wasRelaunched 設為 true,如此接下來的 Mode 為 New 且 Uri 為應用程式首頁的事件時,即可由 wasRelaunched 判斷接下來的行為,在快速回復的重點除了 WMAppManifest 需要設定 ActivationPolicy 為 Resume 之外,再來最重要就在於 ClearBackStackAfterReset 這個 Function 裡面。這個 Function 做的事情大致上就是把不該存在於 Page History Stack 中的頁面移除,例如範例中的 Secondary Tile 導覽至 Page3 時因為帶了 DeepLink=true 所以必須將上一次的導覽紀錄清除。

在範例中也示範了如何在應用程式置於背景超過一段時間的狀況下將其重啟,關鍵在 mustClearPagestack 這個值,每次 Reset 後檢查上一次 Suspended 是否已超過 30 秒,若超過 30 秒即執行預設會進行的 ClearBackStackAfterReset 動作來清除 Page Stack,在不需要清除 PageStack 的狀況下,也就是大多數合理的 Reset 狀況下,包括應用程式置於背景未超過 30 秒,都會進到下面這個判斷式中

if (!mustClearPagestack)
{
    //The app was previously launched via Main Tile and relaunched via Main Tile. Cancel the navigation to resume.
    e.Cancel = true;
    RootFrame.Navigated -= ClearBackStackAfterReset;
}

該判斷式利用將 NavigatingCancelEventArgs 的 Cancel 設為 true 的技巧來取消導覽至應用程式首頁的動作,再將 ClearBackStackAfterReset 從 RootFrame.Navigated 的委派對像中移除,如此上一次的頁面導覽過程便不會被移除,以達到顯示 Suspended 前狀態的目的。

沒有留言:

張貼留言