1

我是 WinRT 的新手,并且正在玩会话状态。我正在导航到一个页面以收集数据,然后想要返回主页。就在导航之前,我正在使用:

SuspensionManager.SessionState["CurrentState"] = someObject;

该对象包含其他轻度复杂对象的列表等...一切似乎都在工作,但这是使用暂停管理器的正确方法吗?

我查看了有关该主题的其他帖子,有人报告说有必要对所有序列化的类使用 [DataContract] 和 [DataMember] 属性。我省略了它们,它仍然有效(跨页面获取数据)。那么推荐的方法是什么?

4

1 回答 1

1

我可能对您的问题的某个方面阅读过多,但是如果应用程序在暂停时实际终止,则SuspensionManagerand的作用SessionState是存储足够的信息以将您的应用程序带回用户离开它的位置。

Windows 8 应用程序生命周期中,如果另一个应用程序出现在前台,您的应用程序将被“暂停”。当您的应用程序暂停时,其所有状态都保留在内存中,如果重新激活(您翻转回它),一切*都会“免费”恢复。

但是,暂停的应用程序也可能被操作系统终止(例如内存压力的 b/c),并且没有机会在您的应用程序中对这种情况做出反应,因此您真正要做的SessionState是存储必要的内容如果应用程序实际终止,则“重新创建”用户所在的最后一个位置。它本质上是一份保险单:如果应用程序只是暂停,SessionState则不是真正需要的。

“什么是必要的”是灰色区域,我可以存储有关正在进行的用户配置文件的所有信息,或者我可以只保存索引到所有用户配置文件数据的持久存储中的用户 ID。我通常有更多的极简主义观点,并且会尽可能少地保留SessionState- 我打个比方,我不需要记住所有内容,我只需要记住如何/从哪里获取/找到所有内容。

您的问题也暗示您SessionState用于在应用程序的页面之间传递信息,而这并不是真正的意图。应用程序的每个页面通常都与视图模型相关联,当您与该应用程序的页面交互时,您将更新视图模型并通过视图模型中已有的更改驱动额外的屏幕和体验。离开你的应用程序的一个屏幕并返回主屏幕也意味着你已经保存了你收集的任何信息 - 当然是视图模型,但也保存到数据库或本地存储等持久化的东西。当您重新访问该页面时,您会将数据从视图模型(或该持久存储)中拉回;主页不需要这些信息,为什么还要坚持呢?

最后,由于您提到是 WinRT 新手,您可能需要查看App Builder,它以可消耗的块的形式汇集了许多资源,以引导您在 30 天内构建应用程序(尽管所有材料都可用,所以你可以以任何你想要的速度消费:)) 与你的问题密切相关的生命周期管理的讨论出现在该序列的第 17 天。

*“一切都免费恢复”并不一定意味着当应用程序退出暂停状态时您没有任何工作要做。可能存在需要刷新的陈旧数据,并且可能需要刷新/重新创建连接或其他临时或短期实体。

于 2013-04-15T03:40:08.007 回答