none
metro中如何实现应用的挂起和恢复? RRS feed

  • 问题

  • 新手刚开始学metro

    看了MSDN上面的资料 还不是很明白

    比如怎么同步保存数据之类的

    可以有一个简单一点的demo看看么?

    谢谢!

    2012年7月20日 9:12

答案

全部回复

  • 我原来询问的帖子应该可以帮你

    http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/fe5ba3df-e90d-4a50-8823-7592fe41a53c

    http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/ab1a1ddc-2248-4951-9b16-407c4fa46b2d

    2012年7月20日 9:58
  • Hi,

    官方提供的示例还是很清楚的,可能比较疑惑的地方在于挂起之前进行的操作实际上分别保存了导航的状态和程序中的数据,而保存导航状态之前就需要通过SuspensionManager进行注册。保存数据分为两种一种是临时数据一种是永久性的数据,临时数据在类似用户关闭程序的情况下会清除。具体可以参考官方的生命周期管理的示例。

    这个帖子说的比较清楚:
    http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/ab1a1ddc-2248-4951-9b16-407c4fa46b2d

    官方示例:
    http://msdn.microsoft.com/zh-cn/library/windows/apps/hh986968.aspx

    Hope this helps

    • 已建议为答案 WillSu 2012年7月23日 11:52
    • 已标记为答案 neal_young 2012年7月24日 5:01
    2012年7月23日 6:42
    版主
  • 谢谢楼上两位。

    还有一个问题想请教下,这边存储数据以及后来恢复数据的代码如下:

            protected override void SaveState(Dictionary<String, Object> pageState)
            {
                pageState["greetingOutputText"] = greetingOutput.Text;

                // The user name is already saved, so we don't need to save it here.
            }

                if (pageState != null && pageState.ContainsKey("greetingOutputText"))
                {
                    greetingOutput.Text = pageState["greetingOutputText"].ToString();
                }

    那如果我保存的不是string类型的数据的话,应该怎么办呢?比如说System.TimeSpan?

    这个pageState是一个什么类型的东西呢?

    2012年7月24日 5:04
  • 谢谢楼上两位。

    还有一个问题想请教下,这边存储数据以及后来恢复数据的代码如下:

            protected override void SaveState(Dictionary<String, Object> pageState)
            {
                pageState["greetingOutputText"] = greetingOutput.Text;

                // The user name is already saved, so we don't need to save it here.
            }

                if (pageState != null && pageState.ContainsKey("greetingOutputText"))
                {
                    greetingOutput.Text = pageState["greetingOutputText"].ToString();
                }

    那如果我保存的不是string类型的数据的话,应该怎么办呢?比如说System.TimeSpan?

    这个pageState是一个什么类型的东西呢?


    另外还有一个问题,调试的时候 出现 错误 1 “EasyRead.VideoPlayer.SaveState(System.Collections.Generic.Dictionary<string,object>)”是密封类“EasyRead.VideoPlayer”中新的虚拟成员 这个错误是什么原因??
    2012年7月24日 5:46
  • Hi,

    第一个问题:在SaveState上面的说明中说的很清楚,需要能够序列化的对象才能够存储。虽然pageState能够接受一个Object类型但是,如果一个非常复杂的类型存储进去就会发生无法序列化的错误。能够序列化的都是一些比较基本的类型比如String,int,double等等。

    当然你也可以自己序列化通过DataContractSerizlizer,具体可以参考这个帖子:

    http://social.msdn.microsoft.com/Forums/en-GB/winappswithcsharp/thread/e0364dbf-c2f5-453c-aa95-eea5398a0db9

    以及这个:

    http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/46b19d4a-60a6-48d3-875d-1ce00993760d

    第二个问题这个错误我没有碰到过能不能把代码贴一下。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年7月24日 9:18
    版主
  • Hi,

    第一个问题:在SaveState上面的说明中说的很清楚,需要能够序列化的对象才能够存储。虽然pageState能够接受一个Object类型但是,如果一个非常复杂的类型存储进去就会发生无法序列化的错误。能够序列化的都是一些比较基本的类型比如String,int,double等等。

    当然你也可以自己序列化通过DataContractSerizlizer,具体可以参考这个帖子:

    http://social.msdn.microsoft.com/Forums/en-GB/winappswithcsharp/thread/e0364dbf-c2f5-453c-aa95-eea5398a0db9

    以及这个:

    http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/46b19d4a-60a6-48d3-875d-1ce00993760d

    第二个问题这个错误我没有碰到过能不能把代码贴一下。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    第二个问题我自己搞定啦,谢谢你!

    再接着问一个问题。

    我写的是一个视频播放页面,然后挂起之后再恢复也确实可以从挂起时的地方开始播放。

    但是当我在SaveState中设置断点,想看看在挂起的时候程序运行情况的时候,为什么SaveState中的断点没用呢?感觉像是写了一段毫无意义的代码。

    2012年7月24日 9:27
  • Hi,

    那么很有可能你的程序并没有真正的挂起,在你程序运行的时候,切换回vs并按上面的suspend and shutdown,之后就会执行挂起的过程。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年7月24日 9:41
    版主
  • Hi,

    那么很有可能你的程序并没有真正的挂起,在你程序运行的时候,切换回vs并按上面的suspend and shutdown,之后就会执行挂起的过程。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    按suspend and shutdown 才是挂起?那么按suspend是执行什么操作呢?
    2012年7月24日 12:57
  • suspend也是挂起,不过suspend and shutdown模拟的是在程序挂起后,有可能因为内存不足而导致程序关闭。通过调试你可以看出来,如果只是点击挂起实际上程序所做的只有OnSuspending和SaveState的过程,之后程序挂起,交由系统自动管理当系统认为内存不足的时候可能会关闭程序。当用户重新打开的时候会从args.PreviousExecutionState == ApplicationExecutionState.Terminated判断,这个代表的就是由系统终结而不是用户终结,因此系统需要将程序恢复原样,将序列化后的导航状态读出。如果RegisterFrame语句在前会自动恢复注册的frame的导航状态,如果RegisterFrame在后,在这个方法中有个private方法RestoreFrameNavigationState就是判断是否导航状态已经先于注册被恢复,因此RegisterFrame语句放前放后都可以。rootFrame.Content == null实际是要判断是用户终结或者第一次打开如果是导航到一个新的页面,如果不是就将现有的恢复了导航状态的frame赋值给Window.Current.Content。而在页面第一次调用的时候,无论是被恢复的还是第一次打开的都会调用LoadState方法,这就是为什么即使关闭存储Localsetting中的数据也会被恢复出来,而如果从挂起恢复的话pageState临时会话数据也会被恢复。

    这就是整个的挂起恢复的流程。

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年7月24日 13:19
    版主