• Windows 8 生命周期管理(2)


    15.1.3 恢复状态

    当应用恢复时,其会从挂起前的状态起继续运行。具体来说就是,在应用处于挂起状态时,应用程序的数据和状态保存在内存中,当应用恢复时,应用的各方面都和挂起时的状态一样,不需要在收到恢复事件的时候通过代码还原任何数据。

    在遇到用户需要应用处在链接状态,并需要显示最新信息的情况中,有可能应用处于挂起状态很长时间才恢复,挂起期间数据或网络链接会过时,并需要在应用恢复时刷新内容。当应用被用户置于前台使用时,应用会接到一个恢复事件,此时可以重新链接网络资源,刷新应用的数据和内容,这样其实程序在挂起时没有运行,但对于用户所看到的来说,是一直运行的,因为在用户查看应用时,它保持了最新信息状态。

    下面证券类应用的代码中,应用恢复时刷新全部在应用挂起前,缓存的股票数据,因为如果让用户恢复应用时,看到的数据是之前的,会给用户造成应用没有继续的印象,所以在恢复时,应用更新了之前所有的数据,请参照一下代码。

    public App()

    {

    InitializeComponent();

    this.Resuming += new EventHandler<object>(App_Resuming);

    }

    async private void App_Resuming(object sender, object e)

    {

    //更新所选股票的信息,及图表数据

    News.RequestNews(stock);

    Data data = await Api.GetStockInfoDataAsync(stock);

    Api.DisplayStockInfo(data);

    Chart chartData = await Api.GetHistoryDataAsync(range);

    CanvasChart.DrawChart("chartCanvas", chartData, Chart.GetChartOptions(false));

    //发送客户端通知

    Tile.SendTileUpdate(stock, stockInfo.Change, stockInfo.LastSale, stockInfo.LastSaleTime, stockInfo.Open);

    }

    15.1.4 激活状态

    激活是指应用的启动方式,在Metro风格的应用中有多种用途,其中包括通过激活处理协议(Contracts),这里主要来讲在Windows终止应用之后,当用户重启应用,通过激活还原之前存储的数据。

    Windows会在应用被挂起后,由于某些原因终止应用程序,比如用户手动地关闭了应用,或用户退出,还有当系统运行的资源快要枯竭时(一些诸如游戏的应用,很会消耗资源)。如果是用户在Windows终止应用后再启动应用,应用会收到一个激活事件,而用户只会看到启动画面直到应用激活完成。通过这里的激活事件,可以选择还原应用在上次挂起状态时,所存储的数据,或只能加载应用的默认起始数据了。激活事件的参数包括一个“PreviousExecutionState”属性,用来告知应用激活之前所处的状态。

    以下是几个终止应用的原因,及将会采取的动作。

    q 系统终止(由于资源限制,关机等原因):此时“PreviousExecutionState”的值为“Terminated”(终止),相应动作为还原Session数据。

    q 用户关闭:此时“PreviousExecutionState”的值为“ClosedByUser”(用户关闭),相应动作为以默认初始数据开始。

    q 意外终止,或是到当前会话中时就没有运行:此时“PreviousExecutionState”的值为“NotRunning”(非运行),相应动作为以默认初始数据开始。

    “PreviousExecutionState”还可以有Running或Suspended的属性值,但在这些情况中,应用不是之前就已经终止了,所以不必担心还原数据。

    当应用被激活并且其“PreviousExecutionState”属性值为“Terminated”时,必须还原所保存的Session数据,使应用看起来像用户最后一次看到的样子。如果是用户手动关闭应用,或应用意外终止,还是没有在当前的会话中运行,则必须忽略之前的会话数据,并以应用的初始状态开始应用程序。

    下面证券类应用的代码中,使用Activated事件将股票和图表信息,带回到应用挂起时所存的状态,应用同样刷新了缓存的网络数据。在OnLaunched事件处理函数中,可以检查在事件参数中的“PreviousExecutionState”属性,如果其值为“Terminated”,则还原在Suspending事件中存的数据;如果不是此值,则使用应用的默认值。

    async protected override void OnLaunched(LaunchActivatedEventArgs args)

    {

    //检查会话的数据是否应被还原

    if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)

    {

    //这里创建了一个“SuspensionManager”类,对从文件中还原会话的数据进行处理,之后访问在字典中的数据。

    await SuspensionManager.RestoreAsync();

    //在挂起处理函数中检索保存的股票和范围值

    stock = SuspensionManager.SessionState["lastSeenStock"];

    range = SuspensionManager.SessionState["lastSeenRange"];

    }

    //如果不是,使用应用的默认值

    else {

    stock = "DOW";

    range = "1M";

    }

    // 开始检索最新股票数据

    Api.InitializeUserStocks();

    Window.Current.Activate();

    }

  • 相关阅读:
    原型模型
    V模型
    瀑布模型
    微服务的特点 优点 缺点
    ip地址的分类
    DSSA特定领域软件体系结构
    Git操作 :从一个分支cherry-pick多个commit到其他分支
    【原理】从零编写ILI9341驱动全过程(基于Arduino)
    Arduino驱动ILI9341彩屏(一)——颜色问题
    STL库学习笔记(一)——什么是STL?
  • 原文地址:https://www.cnblogs.com/finehappy/p/2858203.html
Copyright © 2020-2023  润新知