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





5.00/5 (1投票)
如何在 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