@Tyler,Cyberherbalist:我很遗憾,我不能只是在那里为你的讨论添加评论。我对声望或其他方面的评价过低。我没有任何博客发布它,并给你一个链接。我只是写在这里,因为我认为这是值得注意和写作的地方,所以其他人也可以从中检查/使用/表达利益。
..所以,请原谅我这个“offtopic文章”在这里:)
虽然我不知道如何很好地解决这个问题 - 我的解决方案通常是收集通过手工导航历史堆栈,把它变成iso,并在激活时恢复并跳到右侧/最后一个地方 - 我可以告诉你一些关于墓碑的信息。
的事情是,如果你的应用是停用,但这并不意味着它墓碑。取消激活只是意味着你的应用程序被换出了屏幕。在芒果版本中,您可以点击&按住“返回”设备按钮,查看当前打开了哪些应用程序,然后跳转到任何应用程序。 “激活”是当你的应用程序被唤醒时。即使在WP7 SDK +模拟器的早期版本中,我也从我的应用程序中调用了外部媒体播放器,而且我的应用程序几乎从未被实际中断。取消激活/激活总是恢复我的应用程序就在那里'停止'。所有内存中的对象都未改动。
当设备资源不足时会发生逻辑异常,并且必须“终止”某些后台任务以释放内存。我相信当设备的屏幕保护程序下降并且设备长时间处于待机状态时也可能会发生这种情况。墓碑将逐字杀死您的应用程序,所有内存中的对象将被销毁/删除等。唯一能够幸存的是AppSettings和ISO商店。墓碑保证发生只有如果您的申请是在停用状态。
那么,你可以看到什么样的生命周期?
1) “冻结/待机/无焦点”:
- 启动
- ...(工作)
- 停用(移动到背景)
- ...(保存在内存中,也许进程/线程被冻结,但我怀疑)
- (...)
- 激活(移动到前台,没有导航时)
- ...(工作)
- 关闭
2) “墓碑”:
- 启动
- ...(工作)
- 停用(移动到背景)
- ...(保存在内存中,也许进程/线程被冻结,但我怀疑)
- ...(墓碑,从中删除内存,一切都毁)
- (...)
- ...(洁净应用对象构造)
- 激活(移动到前台)
- 导航中(我想,总是第一,默认页面设置在清单中,但我不能肯定现在)
- (工作)
- 关闭
这意味着,墓碑可能是有点防不胜防,同时也意味着,你总是甲肝一段时间来尝试在停用事件处理程序中使您的状态保持一致。
这也意味着,(除非有一些通知服务,我还不知道),唯一的方法来检测是否从墓碑恢复是依靠...是依靠最致命/不愉快的影响:清除你的记忆。
想象一下最简单的情况:你的App对象有一个属性“private bool _tomb_test”。它可以是任何类型的任何属性/字段。你也可以使用你的“object ViewModel {get; set}”。
要记住的第一件事是,不设置它在构造函数中,并做不分配直列默认值。只是让它漂浮。编译器/运行时会将应用程序对象创建为新的时将其设置为默认值false。这就是要点!
现在:
- 在推出(不构造函数!!!),设置 “_tomb_test =真” 在停用
- ,您的最低持续性状态保存到ISO
- 在激活后,请检查:
- if _tomb_test == false表示您是墓碑式的。你的记忆是干净的,所有的物体都被毁坏了。根据最后写入ISO的数据恢复你的状态,然后开始所有的工作来重新填充/重新下载/重新加载/重新计算/等应用程序状态的所有其他部分
- 但是,如果_tomb_test == true,那意味着墓碑没有发生。你的记忆力未变。也许只是GC踢了进来并收集了死者。所有活着的物体都还活着。该应用程序可以免费运行,就像没有任何事情发生过一样。
虽然它可能看起来很好,请原谅我这个漫长免责声明:
我在用100%的成功当前应用程序已成功使用它,但我不能说这是保证平台的行为。我还没有时间在MSDN上挖掘事实。以上所有内容都来自我对7.0和7.1 SDK版本的观察。
上述方法的一个小问题是它在上依赖于(未经证实的)假设,即内存清除以全有或全无方式工作。
也就是说,假设要么清除所有对象,要么不清除(当前事实:应用程序对象并且被观察为从头开始重新创建,甚至初始导航发生以重新创建UI。案件都没有发生)。
对于假设是错的......我无法想象谁和为什么会决定在.net世界中实现部分内存清除。全面清除意味着杀死应用程序。部分清除意味着摧毁GC世代中的随机生物,并让所有其他生物随着摇晃的手柄或无柄手柄而活着。我无法想象它。我没有观察到它。因此,我认为它是全有或全无。
顺便说一句。如果您观察到部分清除并找到一种大致确定的方式来引起它,那么其他人也可能会看到它,请大声播放! :)
只是一个简短的说明,但也许这可以帮助吗?我还没有尝试过,但它看起来很有希望。 http://tombstonehelper.codeplex.com/ – 2011-05-24 14:12:26