从墓碑中恢复时,是否有一种很好的/优雅的方法可以返回到用户所在的页面?我不确定我的应用程序或它的运行方式,但是我总是回到我的主页上。

我的应用程序设置了一个具有枢轴控件的主页,并且其中一些枢轴项将导航到新页面。如果可行,我的Naigation看起来像这样:

PivotItem1-> PageA
PivotItem2-> PageB-> PageC
PivotItem3-> PageD-> PageE-PageF(按PageF上的“后退”按钮将使用非线性导航服务返回主页)

因此,如果用户在任何页面上创建了墓碑,我都希望将其返回到该页面并具有BackStack可用,这样导航就不会搞砸了。

我正在使用MVVM Light和非线性导航服务,如果这有助于或伤害我想要完成的工作。

最佳答案

@泰勒(Cyber​​herbalist):很遗憾,我不能就此在您的讨论中“添加评论”。我的声誉还是太低了。我也没有任何博客可以在此发布并提供链接。我只在这里写信,因为我认为值得一提并在某处写东西,因此其他人也可以从中检查/使用/获得永久性利润。

..so,请问我这里的“主题文章” :)

虽然我不知道如何很好地解决问题-我的解决方案通常是手动收集导航历史记录堆栈,将其放入iso中,然后恢复激活状态并跳转到最右/最后一个位置-我可以告诉您一点关于墓碑的一点点。

问题是,如果您的应用程序被停用,而不是并不意味着它已被删除。停用只是意味着您的应用程序被交换出了屏幕。在Mango版本中,您可以点击并按住“后退”设备按钮,查看当前打开了哪些应用程序,然后跳至任何一个。当您的应用程序被唤醒时,“已激活”。即使在WP7 SDK + Emulator的早期发行版中,我也从应用程序中调用外部媒体播放器,而我的应用程序几乎从未被物理杀死。停用/激活总是在“停止”的地方继续我的应用程序。所有内存对象均未触及。

当设备资源不足时,会发生逻辑删除,并且必须“杀死”某些后台任务以释放内存。我相信,当设备的屏幕保护程序降下来并且设备长时间处于待机状态时,也会发生这种情况。逻辑删除实际上会杀死您的应用程序,所有内存中的对象都将被销毁/删除等。唯一能够幸存的是AppSettings和ISO存储。如果您的应用程序处于停用状态,则保证墓碑发生

那么,您可以看到哪些生命周期?

1)“冻结/待机/不对焦”:

  • 启动
  • ...(工作中)
  • 已停用(移至后台)
  • ...(保留在内存中,也许进程/线程被冻结,但我怀疑)
  • (...)
  • 已激活(移至前景,未发生导航)
  • ...(工作中)
  • 关闭

  • 2)“墓碑”:
  • 启动
  • ...(工作中)
  • 已停用(移至后台)
  • ...(保留在内存中,也许进程/线程被冻结,但我怀疑)
  • ...(已逻辑删除,已从内存中删除,所有内容均已破坏)
  • (...)
  • ...(构建的干净应用程序对象)
  • 已激活(移至前景)
  • 导航(我认为,总是到 list 中设置的第一个默认页面,但现在不确定)。
  • (工作中)
  • 关闭

  • 这意味着墓碑化可能很难检测到,但也意味着您总是有时间尝试在停用事件处理程序中恢复您的状态。

    这也意味着(除非有我不知道的某些通知服务),检测从墓碑恢复是否要依靠的唯一方法是依靠最致命/最不愉快的效果其中:清除内存。

    想象一个最简单的情况:您的App对象具有属性“private bool _tomb_test”。它可能是ANY类型的ANY属性/字段。您也可以为此使用“对象ViewModel {get; set}”。

    首先要记住的是, NOT 以便在构造函数中进行设置,并 NOT 分配一个内联默认值。只是让它漂浮。每当新建App对象时,编译器/运行时会将其设置为默认false。这就是重点!

    现在:

    在Launched中启动
  • (不是ctor !!!),将“_tomb_test = true”设置为
  • 停用
  • ,将您的最小持久状态保存为ISO
  • 已激活,请检查:
  • 如果_tomb_test == false表示您已被墓碑化。您的内存干净,所有对象均被销毁。根据上次写入ISO的数据恢复您的状态,然后启动所有作业以重新填充/重新下载/重新加载/重新计算/等应用状态的所有其他部分
  • ,但是,如果_tomb_test == true,则表示未发生墓碑删除。您的内存未受影响。也许只是GC启动并收集了死者。所有活着的物体都还活着。该应用程序可以自由运行,就好像什么都没有发生一样。

  • 尽管它看起来很漂亮,但请原谅我这个冗长的免责声明:

    我在当前应用程序中成功使用了它,并获得了100%的成功,但是我不能说这可以保证平台的行为。我尚未找到时间来挖掘MSDN上的事实。以上所有内容均来自我对7.0和7.1 SDK版本的观察。

    上述方法的一个小问题是,它依赖于(未经证实?)假设,即内存清除以“全有或全无”的方式工作。

    也就是说,假定清除了所有对象,或者没有清除(当前事实:观察到是从头开始重新创建App对象,并且甚至发生了初始导航来重新创建UI)。发生)。

    对于错误的假设...我只是无法想象谁和为什么会决定在.net世界中实现部分内存清除。完全清除意味着杀死该应用程序。部分清除意味着销毁GC世代中的随机 Activity 对象,并使其余所有对象保持悬空的手柄或无效的手柄。我无法想象。我还没有观察到。因此,我认为这是全有还是全无。

    顺便提一句。如果您发现部分清除并找到一种确定性的方式来引起它,那么其他人也可能会看到它,请大声广播! :)

    10-08 00:04