Windows 8 应用开发 - 挂起与恢复
Windows 8 应用通常涉及到两种数据类型:应用数据与会话数据。在上一篇提到的本地数据存储就是应用层面的数据,包括应用参数设置、用户重要数据等。那么会话层面的数据是基于用户每次使用应用而形成,这些数据可能不需要留存在设备中。在整个应用生命周期中,应用启动后便进入运行状态。当用户离开或系统进入待机状态时,应用会进入挂起状态,此时应用将被放入到内存中,待用户重新使用时便会恢复成运行状态。

在这个过程中用户之前可能已经录入了一些数据,并且希望在应用恢复时可以继续进行录入。对于开发者来说,我们需要在应用挂起时将一些会话数据进行保存,当应用恢复后同时将暂存数据复原,以便让用户继续使用。需要注意的是MSDN中提到:“当用户通过按 Alt+F4 或使用关闭手势关闭应用时,应用将被挂起 10 秒钟然后被终止。”也就意味着关闭的应用只有10秒钟时间可以被恢复。下面将通过实例进行演示,首先创建一个Textbox 让用户录入名字进行会话操作。我们首先来尝试一下没有进行挂起暂存处理的应用是何种结果。
<StackPanel Grid.Row="1" Margin="120,30,0,0">
<StackPanel Orientation="Horizontal" Margin="0,20,0,20">
<TextBlock Text="Name: " Style="{StaticResource BasicTextStyle}" Width="50"/>
<TextBox x:Name="nameInput" Width="200"/>
</StackPanel>
</StackPanel>
挂起
直接按F5运行应用,在Name 栏中输入名字或任意字符。在VS2012的Debug Location 工具栏可以看到挂起(Suspend )的选项,我们选择挂起并终止(Suspend and shutdown),程序挂起后从系统左侧菜单栏里找到之前的应用重新启用,恢复后的应用Name 栏中的文字已经丢失。对于名字这样的简单录入还可以接受,如果录入项较多的话那将损失惨重。

接下来我们将进行应用挂起处理,打开App.xaml.cs 程序,在OnLaunched 方法中创建了rootFrame,当rootFrame 为Null 时将重新创建Frame,在这个逻辑判断中要使用SuspensionManager.RegisterFrame 方法进行rootFrame 注册,这样才可以使应用获得根Frame 信息并进行数据存储。
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame(); SuspensionDemo.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame"); if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
} // Place the frame in the current Window
Window.Current.Content = rootFrame;
}
在OnSuspending 方法中,使用SuspensionManager.SaveAsync 方法将挂起应用的当前状态进行保存,这里可以调用异步操作来进行处理。
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
await SuspensionDemo.Common.SuspensionManager.SaveAsync();
deferral.Complete();
}
注册完成后,打开MainPage.xaml.cs 在SaveState 方法中添加如下代码,使应用挂起时能将Name 字段保存起来。
protected override void SaveState(Dictionary<String, Object> pageState)
{
pageState["name"] = nameInput.Text;
}
恢复
挂起操作完成后,就要进行恢复操作,将暂存的数据恢复到应用中。再次打开App.xaml.cs 在PreviousExecutionState 判断为Terminated 时加入SuspensionManager.RestoreAsync 方法恢复以前的应用状态。
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{ Frame rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first
rootFrame = new Frame(); SuspensionDemo.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame"); if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
await SuspensionDemo.Common.SuspensionManager.RestoreAsync();
} // Place the frame in the current Window
Window.Current.Content = rootFrame;
} if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
// Ensure the current window is active
Window.Current.Activate();
}
最后,在MainPage.xaml.cs 的LoadState 方法中将pageState的Name 字段内容恢复即可。我们再次F5运行应用;录入姓名;挂起并终止应用,应用恢复后可以看到之前录入的姓名仍然存在。
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
if (pageState != null && pageState.ContainsKey("name"))
{
nameInput.Text = pageState["name"].ToString();
}
}
源码下载
Windows 8 应用开发 - 挂起与恢复的更多相关文章
- 【本人译作推荐】Windows 8应用开发:C#和XAML卷(原名:Building Windows 8 Apps with C# and XAML)
[图书推荐] 译名:Windows 8应用开发:C#和XAML卷 原名:Building Windows 8 Apps with C# and XAML 编辑推荐 国内第一本使用XAML与C#语言 ...
- .Net Core 3 骚操作 之 用 Windows 桌面应用开发 Asp.Net Core 网站
前言 曾经在开发 Asp.Net 网站时就在想,为什么一定要把网站挂到 IIS 上?网站项目的 Main 函数哪儿去了?后来才知道这个 Main 函数在 w3wp.exe 里,这也是 IIS 的主进程 ...
- 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
Dixon 原文 用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...
- MFC任务管理器task manager----进程的挂起与恢复--NtSuspendProcess&&NtResumeProcess
http://hi.baidu.com/xbbsh/blog/item/b73d3125462201084c088db1.html ---------------------------------- ...
- VMware Authorization Service不能启动 VMware虚拟机状态已挂起无法恢复解决方案
在网上看说在服务里面启动 但也是不能用 电脑上说是WINDOWS无法启动VMware Authorization Service服务(位于本地计算机上)错误:1068 依赖服务或组无法启动 这个很简单 ...
- windows phone 网络开发三部曲(一)各种包的各种抓法
首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...
- Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07 北京海淀区 ...
- Windows 网络通讯开发
Windows 网络通讯开发 一.Windows网络开发API 由于C++标准库中没有网络库,所以进行网络开发的时候要调用系统API.Windows通讯开发API包括以下几个基本函数及成员类型: 1. ...
- 《Windows IoT 应用开发指南》
物物互联的时代已经到来,智能家居.智慧校园.智慧交通.可穿戴.无人机.全息投影,各种各样的新名词.黑科技层出不穷.当我们为五年前能够通过手机控制家电而欣喜若狂的时候,可曾憧憬过当前使用增强现实设备完成 ...
随机推荐
- Codeforces Round #309 (Div. 2) C
题意: 就是给出总共同拥有k种颜色.每种颜色有ki种,排列必须满足第i+1种的最后一种颜色必须在第i种最后一种颜色的后面,其它颜色任意.总共同拥有多少种排列点的方法. 分析: 如果d[i]表示前i种的 ...
- codeforces 325B Stadium and Games
这道题思路很简单,设刚开始队伍数为d=2^p*x,其中x是奇数,则比赛场次n=(2^p-1)*x+(x-1)*x/2,然后从0开始枚举p的值,接着解一元二次方程x^2+(2^(p+1)-3)x-2*n ...
- Android真机网络adb联机调试初探
新项目是一个基于android4.2设备.刚拿到demo板时就对联机互调感兴趣了.处于以前在S3c2440上对linux的移植使用经验.心里猜测对于android设备应该也这样.所以通过搜索资料整理如 ...
- struts2对action中的方法进行输入校验(2)
struts2输入校验流程: 1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性 2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext, ...
- 拿到阿里,网易游戏,腾讯,smartx的offer的过程 (转)
前言 从今年的3月14日阿里的电话面试开始,到现在4月16日在西安悦豪酒店进行的腾讯HR面到现在一个多月了,中间先后收到了阿里,网易游戏,腾讯和smartx的offer,今天早晨刚刚接到了腾讯HR的电 ...
- hdu3605(最大流+状态压缩)
传送门:Escape 题意:给出每个人适合住的星球信息和该星球能住多少人 ,第一行给出n m 代表有 n 个人 m 个星球,然后接下来n行每行m个数字 1代表适合第 i 个星球 0 代表不适合第 i ...
- 自己定义控件(2.2):SurfaceView和SurfaceHolder
本例需求及流程: Activity载入自己定义的SurfaceView-> SurfaceView 构造器中启动线程A.循环改变SurfaceView的x,y坐标,当x,y坐标到某点时设渐显标志 ...
- (7)基于hadoop的简单网盘应用实现3
一.login.jsp登陆界面实现 解压bootmetro-master.zip,然后将\bootmetro-master\src\下的assets目录复制到project里. bootmetro下载 ...
- asp.net EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
出现的错误信息如下所示: 指定的架构无效.错误: DataModel.ssdl(2,2) : 错误 0152: 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提 ...
- hdu1495(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意:有三个杯子,开始时第一个杯子装满水(体积为a),倒来倒去,得到其中2个杯里的水的体积都为a ...