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();

}

posted on 2013-01-13 09:13  冯瑞涛  阅读(338)  评论(0编辑  收藏  举报