WP7从Tombstone恢复并返回页面

2024-02-22

从逻辑删除恢复时,是否有一种很好/优雅的方式返回用户所在的页面?我不确定我的应用程序是否正常工作,但我总是回到我的主页。

我的应用程序设置了一个带有枢轴控件的主页,并且多个枢轴项目将导航到新页面。如果有意义的话,我的导航看起来像这样:

数据透视项 1 -> PageS
PivotItem 2 -> 页面 -> PageS
PivotItem3 -> PageD -> PageE - PageF(按 PageF 上的后退按钮将使用非线性导航服务返回主页)

因此,如果用户在任何页面上建立墓碑,我希望将它们返回到该页面并提供可用的 BackStack,这样导航就不会搞砸。

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


@Tyler,Cyber​​herbalist:我很遗憾我不能直接在您的讨论中“添加评论”。我的声誉还是太低了。我没有任何博客可以将其发布到那里并为您提供指向它的链接。我就写在这里,因为我认为值得注意并写在某个地方,所以其他人也可以检查/使用/性能从中获利。

..所以,请原谅我在这里写这篇“题外话”:)

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

问题是,如果您的申请是停用,这确实not意味着它已被墓碑化。停用只是意味着您的应用程序被移出屏幕。在 Mango 版本中,您可以点击并按住“后退”设备按钮,查看当前打开的应用程序,然后跳转到任何应用程序。 “激活”是指您的应用程序被唤醒。即使在 WP7 SDK+模拟器的早期版本中,我也从我的应用程序中调用外部媒体播放器,并且我的应用程序几乎从未被物理杀死。停用/激活总是在“暂停”的地方恢复我的应用程序。所有内存中的对象都未受影响。

当设备资源不足时,就会发生逻辑删除,并且必须“终止”一些后台任务以释放内存。我相信当设备的屏保下拉或者设备长时间处于待机状态时也可能会出现这种情况。逻辑删除实际上会杀死您的应用程序,所有内存中的对象都将被销毁/删除等等。唯一能够幸存的就是 AppSettings 和 ISO 存储。墓碑效应肯定会发生ONLY如果您的申请位于停用 state.

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

1)“冻结/待机/失焦”:

  • 发射
  • ... (在职的)
  • 已停用(移至后台)
  • ...(保存在内存中,也许进程/线程被冻结,但我怀疑)
  • (...)
  • 已激活(移至前台,不发生导航)
  • ... (在职的)
  • Closing

2)“墓碑”:

  • 发射
  • ... (在职的)
  • 已停用(移至后台)
  • ...(保存在内存中,也许进程/线程被冻结,但我怀疑)
  • ...(被墓碑化,从记忆中删除,一切都被摧毁)
  • (...)
  • ...(构造干净的应用程序对象)
  • 已激活(移至前台)
  • 导航(我认为,总是到清单中设置的第一个默认页面,但我现在不确定)
  • (在职的)
  • Closing

这意味着,墓碑可能有点难以检测,但也意味着,您总是有时间尝试在停用事件处理程序中保持相同的状态。

这也意味着(除非有一些我还不知道的通知服务),检测从墓碑恢复是否依赖的唯一方法是依赖最致命/最不愉快的效果其中:关于清除你的记忆。

想象一个最简单的情况:您的 App 对象有一个属性“private bool _tomb_test”。它可以是任何类型的任何属性/字段。您也可以使用“object ViewModel{get;set}”来实现此目的。

首先要记住的是,NOT在构造函数中设置它,然后执行NOT分配内联默认值。让它漂浮即可。每当新创建 App 对象时,编译器/运行时都会将其设置为默认 false。这就是重点!

now:

  • 在 Launched (不是 ctor!!!) 中,设置“_tomb_test = true”
  • 在停用状态下,将最低持久状态保存到 ISO
  • in activated, check:
    • 如果 _tomb_test==false 则意味着您已被墓碑化。你的记忆是干净的,所有的物体都被摧毁了。根据上次写入 ISO 的数据恢复您的状态,然后启动所有作业来重新填充/重新下载/重新加载/重新计算/等应用程序状态的所有其他部分
    • 但是,如果 _tomb_test==true,则意味着逻辑删除未发生。你的记忆未受影响。也许只是 GC 启动并收集了死者。所有曾经有生命的物体仍然活着。该应用程序可以免费运行,就像什么都没发生一样。

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

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

上述方法的一个小问题是relies基于(未经证实?)的假设,内存清除以全有或全无的方式进行。

也就是说,假设所有对象都被清除,或者没有发生清除(当前事实:App 对象被观察到从头开始重新创建,甚至发生初始导航来重新创建 UI。在其他情况下,这两种情况都不会发生)发生)。

对于错误的假设...我无法想象谁以及为什么会决定在 .net 世界中实施部分内存清除。完全清除意味着杀死该应用程序。部分清除意味着销毁 GC 代中的随机活动对象,并让所有剩余的对象保持悬空句柄或空句柄。我无法想象。我没有观察到。因此,我认为这是全有或全无的情况。

顺便提一句。如果您观察到部分清除并找到了导致它的主要确定性方式,以便其他人也可能看到它,请大声广播! :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WP7从Tombstone恢复并返回页面 的相关文章

随机推荐

  • Linq 中的多个 WHERE 子句

    我是 LINQ 新手 想知道如何执行多个 where 子句 这就是我想要实现的 通过过滤掉某些用户名来返回记录 我尝试了下面的代码 但没有按预期工作 DataTable tempData DataTable grdUsageRecords
  • PHP $_GET 未从 Web 浏览器填充 URL 查询参数

    我遇到了一个奇怪的问题 GET and REQUEST 变量为空 即使正在传递参数 我的 PHP 代码 echo SERVER REQUEST URI echo print r REQUEST echo print r GET Output
  • MVVM light - 如何访问其他视图模型中的属性

    我正在使用 mvvm light 构建 Silverlight 应用程序 是否有代码片段显示如何从另一个视图模型或用户控件的隐藏代码中访问视图模型的属性或命令 我想这很简单 但我不知何故错过了一些东西 Ueli 您可以使用 Messenge
  • 控制器内的 SignalR 身份验证?

    我正在使用 SignalR 但我似乎无法掌握身份验证来构建用于公共聊天和安全聊天的演示应用程序 有一个聊天室 我想演示经过身份验证的用户将收到公共消息and经过身份验证的用户消息 身份验证是使用现有的 MVC 3 Internet 应用程序
  • 编写无需 requirejs 即可运行的 Requirejs 模块

    我想以某种方式创建我的模块 它们可以与 requirejs 一起使用 也可以不与 requirejs 一起使用 如果没有 require js 它们应该正常工作 所以我必须确保它们正确加载 比如以正确的顺序放置脚本标签 所以 jQuery
  • 你好,我刚刚用 pip 安装了 requests 但无法导入它

    例如我的代码是 import requests r requests get https www python org r status code 结果是 Traceback most recent call last File C Use
  • 添加多个自定义http请求标头之谜

    HttpGet request new HttpGet https 192 168 1 140 8732 我想知道为什么我只能成功发送自定义标头 UserName 和 AuthToken 如果我执行以下操作 request setHeade
  • 使用一些曲线球在 Swing JTextArea 上强制执行最大字符数

    我正在尝试向 Swing JLabel 和 JTextArea 添加功能 以便 用户只能在文本区域输入 500 个字符 最多 标签包含一条字符串消息 告诉用户还剩下多少个字符 每次击键或退格后 当组件初始化时 标签显示 最多 500 个字符
  • 为Android项目创建自己的jar库时出错

    目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识 我跟着如何从 Android Studio 项目中生成 jar https stackoverflow com a 21713954 3022836 and
  • Dagger 2 基类注入

    在 Dagger 1 中 我有一个基类设置 以便它可以处理创建作用域图并将依赖项注入当前对象 例如 public abstract class MyBaseActivity extends Activity private ObjectGr
  • 如何查看通道消费者引发的异常

    我开始使用django channels我觉得这太棒了 然而 调试消费者是痛苦的 因为当消费者内部引发一些异常时 没有任何内容打印到终端 websocket 只是断开连接 未显示的异常类型不易识别 系统地情况是这样的AssertionErr
  • 为 Android 构建 ltrace

    我正在尝试为 Android 构建 ltrace 我尝试了几种方法都没有效果 我能够使用 crosstool ng 的 arm unknown linux gnueabi 生成一个编译源代码的 bin 文件 并且 configure hos
  • PHP json_encode 不会转义所有 JSON 控制字符

    PHP的json encode函数没有转义所有原因吗JSON http www json org 字符串中的控制字符 例如 我们采用一个跨越两行并包含控制字符 r n 的字符串 请注意 回车符和换行符是未转义的 为什么 我使用 jQuery
  • 在迭代列表时将元素添加到列表中。 (Java)[重复]

    这个问题在这里已经有答案了 可能的重复 Java 在迭代期间向集合添加元素 https stackoverflow com questions 993025 java adding elements to a collection duri
  • C++ - 如何截屏(某些窗口除外)

    情况 我有一个通过 Internet 执行屏幕共享的软件 其中一个用户充当演示者 其他用户充当观众 与会者 除了演示窗口之外 演示者还会在屏幕上显示一组非共享窗口 用于开始共享 停止共享等的按钮栏 Skype 窗口等 演示者可以通过屏幕共享
  • 在 C++ 中扩展枚举?

    C 有没有办法扩展 继承 枚举 I E enum Enum A B C enum EnumEx public Enum D E F 或者至少定义它们之间的转换 不 那里没有 enum确实是 C 中的可怜之处 这当然是不幸的 即便是class
  • 包含conj的接口?

    作为练习 我正在开发一个类似于 Vector 的数据结构 我已经实现了 IPercientVector 扩展的所有接口 但我还没有找到定义 conj 的接口 那是哪个界面 谢谢 clojure lang IPersistentCollect
  • 与push()相反; [复制]

    这个问题在这里已经有答案了 JavaScript 的反义词是什么push method 假设我有一个数组 var exampleArray remove 我想要push 这个单词 keep exampleArray push keep 如何
  • “职称级别不一致”是什么意思?

    我在我的文档版本中收到了各种 标题级别不一致 的警告 据我所知 我有一个一致的结构 如下所示 Big Title Section Subsection 但该错误与自动生成相关 automodapi 我无法找到的文本 Classes 我怎样才
  • WP7从Tombstone恢复并返回页面

    从逻辑删除恢复时 是否有一种很好 优雅的方式返回用户所在的页面 我不确定我的应用程序是否正常工作 但我总是回到我的主页 我的应用程序设置了一个带有枢轴控件的主页 并且多个枢轴项目将导航到新页面 如果有意义的话 我的导航看起来像这样 数据透视