65.9K
CodeProject 正在变化。 阅读更多。
Home

管理 Windows Phone 7 应用程序中的 Tombstone 状态

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 5 月 2 日

Ms-PL

2分钟阅读

viewsIcon

16056

如何在 Windows Phone 7 应用程序中管理 Tombstone 状态

在继续之前,我相信您已经清楚地了解了 Windows Phone 7 应用程序中“墓碑状态”的含义。如果不是这样,请阅读 Yochay 关于应用程序执行模型的精彩文章(第一部分第二部分第三部分)。

每个 Windows Phone 7 应用程序都需要正确管理墓碑状态,以提供更好的用户体验并满足 应用程序认证要求

当您的应用程序进入墓碑状态时,您有责任保存所有应用程序和页面状态,以便页面重新加载时,可以正确恢复并重新加载先前的数据。 这样,用户甚至不会意识到应用程序进程被终止并重新加载了。

为了简化墓碑状态的处理,我创建了一个简单的 StateManager 类,它有助于在进入墓碑状态时序列化数据,并在返回时反序列化数据。

如何使用 StateManager?

假设您当前页面具有以下您希望在墓碑状态之间保存的数据成员

  • LastPosts
  • Posts
  • 注释
  • 图像

现在您需要做的就是,在应用程序进入墓碑状态时保存它们,并在从墓碑状态返回时重新加载它们。

保存数据

保存数据的代码应该放在 OnNavigatedFrom 方法中。 在此方法中,您应该为要保存的页面的每个成员调用辅助扩展方法 SaveState,传递要保存的值和用于保存它的键

protected override void OnNavigatedFrom(NavigationEventArgs e)
 {
     this.SaveState("LastPostsKey", LastPosts);
     this.SaveState("PostsKey", Posts);
     this.SaveState("CommentsKey", Comments);
     this.SaveState("ImagesKey", Images);
 }

加载数据

加载数据的代码应该放在 OnNavigatedTo 方法中。 在此方法中,您应该为要加载的页面的每个成员调用辅助扩展方法 LoadState,传递与成员值相关的键

protected override void OnNavigatedTo(NavigationEventArgs e)
 {
     LastPosts = this.LoadState<ObservableCollection<RssItem>>("LastPostsKey");
     Posts = this.LoadState<ObservableCollection<RssItem>>("PostsKey");
     Comments = this.LoadState<ObservableCollection<RssItem>>("CommentsKey");
     Images = this.LoadState<ObservableCollection<ImageItem>>("ImagesKey");
 }

StateManager 的定义

StateManager 类的定义是什么样的? 它就像以下两个扩展方法一样简单

/// <summary>
 /// State Manager
 /// </summary>
 public static class StateManager
 {
     /// <summary>
     /// Saves a key-value pair into the state object
     /// </summary>
     /// <param name="phoneApplicationPage">The phone application page.</param>
     /// <param name="key">The key.</param>
     /// <param name="value">The value.</param>
     public static void SaveState(this PhoneApplicationPage phoneApplicationPage, 
                                  string key, object value)
     {
         if (phoneApplicationPage.State.ContainsKey(key))
         {
             phoneApplicationPage.State.Remove(key);
         }
 
         phoneApplicationPage.State.Add(key, value);
     }
 
     /// <summary>
     /// Loads value from the state object, according to the key.
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="phoneApplicationPage">The phone application page.</param>
     /// <param name="key">The key.</param>
     /// <returns>The loaded value</returns>
     public static T LoadState<T>(this PhoneApplicationPage phoneApplicationPage, string key)
         where T : class
     {
         if (phoneApplicationPage.State.ContainsKey(key))
         {
             return (T)phoneApplicationPage.State[key];
         }
 
         return default(T);
     }
 }

注意:此代码最初作为 Windows Phone 开发者培训工具包 中“使用 Pivot 和 Panorama 控件”实验室的一部分发布,我为 Microsoft 编写了该工具包。

暂时就到这里,
Arik Poznanski

© . All rights reserved.