老周的博客专栏:http://blog.csdn.net/tcjiaan
转载请注明原作者和出处。
创建Win8“板砖”应用后,我们不妨关注一下App类。在生成的代码中我们可以看到,主要处理了两个事件:
一、重写OnLaunched方法;
二、处理Suspending事件。
App类的代码如下,这是项目模板生成的。
namespace MyApp
{
/// <summary>
/// 提供特定于应用程序的行为,以补充默认的应用程序类。
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// 初始化单一实例应用程序对象。这是执行的创作代码的第一行,
/// 逻辑上等同于 main() 或 WinMain()。
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// 在应用程序由最终用户正常启动时进行调用。
/// 当启动应用程序以执行打开特定的文件或显示搜索结果等操作时
/// 将使用其他入口点。
/// </summary>
/// <param name="args">有关启动请求和过程的详细信息。</param>
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
// 不要在窗口已包含内容时重复应用程序初始化,
// 只需确保窗口处于活动状态
if (rootFrame == null)
{
// 创建要充当导航上下文的框架,并导航到第一页
rootFrame = new Frame();
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: 从之前挂起的应用程序加载状态
}
// 将框架放在当前窗口中
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// 当未还原导航堆栈时,导航到第一页,
// 并通过将所需信息作为导航参数传入来配置
// 参数
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
// 确保当前窗口处于活动状态
Window.Current.Activate();
}
/// <summary>
/// 在将要挂起应用程序执行时调用。在不知道应用程序
/// 将被终止还是恢复的情况下保存应用程序状态,
/// 并让内存内容保持不变。
/// </summary>
/// <param name="sender">挂起的请求的源。</param>
/// <param name="e">有关挂起的请求的详细信息。</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: 保存应用程序状态并停止任何后台活动
deferral.Complete();
}
}
}
那么,处理这两个事件干吗?各位还记得Windows Phone开发的时候,我们说到的应用程序状态吗?在应用程序挂起或者结束后,状态信息有可能会丢失,我们会在适当的时候保存状态信息,在必要时恢复。
现在我们把OnLaunched方法改一下,修改后如下所示。
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
/*------------------------------------------------------------------------------------*/
// 判断前一个状态
string State = string.Empty;
switch (args.PreviousExecutionState)
{
case ApplicationExecutionState.ClosedByUser:
State = string.Format("{0} - 应用程序被用户关闭。", DateTime.Now.ToString("HH:mm:ss"));
break;
case ApplicationExecutionState.NotRunning:
State = string.Format("{0} - 应用程序未运行。", DateTime.Now.ToString("HH:mm:ss"));
break;
case ApplicationExecutionState.Running:
State = string.Format("{0} - 应用程序正在运行。", DateTime.Now.ToString("HH:mm:ss"));
break;
case ApplicationExecutionState.Suspended:
State = string.Format("{0} - 应用程序被挂起。", DateTime.Now.ToString("HH:mm:ss"));
break;
case ApplicationExecutionState.Terminated:
State = string.Format("{0} - 应用程序终止运行。", DateTime.Now.ToString("HH:mm:ss"));
break;
default:
State = "无";
break;
}
System.Diagnostics.Debug.WriteLine(State);
/*------------------------------------------------------------------------------------*/
……
}
要理解某一东西,最好的方法,莫过于亲自来试一试。
按F5运行应用程序,注意看“输出”窗口,如果没有打开“输出”窗口,在程序运行后,回到VS,从“调试”菜单下的“窗口”里面找。
当程序运行后,再回到VS,我们在“输出”窗口中看到的是“程序未运行”。
哦?这是为什么呢?程序运行了,怎么会未运行呢?
看清楚了,args.PreviousExecutionState属性指的是应用程序被激活时的“前一个状态”,我们第一次运行程序,那么它的前一个状态当然是未运行了。
在“调试位置”(这个估计翻译问题,其实也挺难翻译的)中,在下拉列表中选择“挂起”,这样我们可以模拟应用程序挂起。
选择后,再点一下“挂起”,这时候,应用程序已经挂起。
接着,再选择“继续”。
再点击一下“继续”,这时候,将模拟应用程从挂起状态恢复。
我们发现,在“挂起”和“继续”之间并没有输出内容。因为在这两个状态切换之间,应用程序仍在运行,也就是说,应用程序没有执行OnLaunched方法。
这时候,我们点击“开始”,回到开始屏幕,并切换到Windows桌面,然后把鼠标移到左上角,当看到应用程序的窗口时,把它拖进桌面,不要松开鼠标,直接向下扔,就像扔垃圾一样。这样,就关闭了应用程序。当然,还有一种方法,当鼠标移到屏幕左上角,当看到应用程序缩略图时,右击,从弹出菜单中选择“关闭”也可以关闭应用程序。
这样,应用程序是被用户关闭了的,接着,回到VS,稍等一下,等调试结束后,按F5再次运行。看看这回会输出什么?
因为刚才我们通过用户操作终止应用程序,再次运行,OnLaunched方法被执行,这时候,输出内容为“应用程序被用户关闭”,即前一个状态。
就像当初模板生成的代码一样,保存和恢复状态数据,只关注Launch和Suspend两个行为即可,上面的试验说明,应用程序被激活有两个状态:挂起后终止,用户关闭。这两种情况下我们需要恢复相关数据,即
ApplicationExecutionState.Terminated
ApplicationExecutionState.ClosedByUser
其实,按照VS生成的代码模板和注释提示处理即可,这里我只是为了演示才修改了代码。
分享到:
相关推荐
android提供一个开放的开发环境,为针对移动设备编写创新应用程序带来了激动人心的新机遇。作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入...
博文《新时尚Windows8开发(40)》中的实例源代码,服务端为Windows Forms应用,客户端为Windows Store应用。
这种结构化的基于任务的多标签时尚研究文章分类为研究人员提供了明确的研究方向,方便了他们访问相关研究,同时...此外,我们还提供了86个公共fashion数据集的列表,以及建议的应用程序列表和每个应用程序的附加信息。
我们为开发人员团队开发了一个名为“ Boost Hub”的协作工作区应用程序。 它是可定制的,易于为您的团队进行优化,例如乐高积木,甚至可以让您实时一起编辑文档! 带有GitHub Flavored Markdown的Polished Notes应用...
Bootstrap 是快速开发 Web 应用程序的前端工具包。它是一个 CSS,HTML 和 JS 的集合,它使用了最新的浏览器技术,给你的 Web 开发提供了时尚的版式; AJAX,创建交互式网页应用的网页开发技术。 【设计思路】 用户...
应用程序周围的自动DevOps工具 git push您的代码git push送到Batcave ,并将构建打包回到一个智能docker映像中,该映像具有日志和perfs监视,服务发现以及配置管理器设置。 该项目建立在: , 和 所有人的荣誉。 ...
这个时尚和用户友好的应用程序可用于Android和iOS平台,使其能够访问到广泛的用户。该应用程序包括三个不同的组件:用户应用程序,交付应用程序和管理应用程序,所有这些都旨在帮助用户和洗衣服务提供商简化洗衣过程...
TTY是一个工具箱,用于在Ruby中开发漂亮的命令行客户端,并具有一个用于收集输入,查询终端属性和显示信息的流畅接口。 动机 与终端交互的所有库经常创建其自己的接口逻辑,该逻辑收集来自用户的输入并向后显示信息...
该项目的目的是创建一个应用程序,该应用程序包含时尚的健身日记的外观和简单性,同时又保持软件应用程序的可用性。 用户可以快速记录当天的不同类型的锻炼,查看和修改任何过去或将来的记录,并跟踪他们的体重和...
纺织服装行业品牌时尚中期策略报告:新经济周期下,大众品牌消费将成为主导-0615-招商证券-37页.pdf
Visual C++.NET小游戏开发时尚编程百例:Visual C++.NET小游戏开发时尚编程百例(实例1-50) 因为资源较大,故分两次上传
BCG-文化:对新时尚和奢侈品消费者最重要的事(英文)-2020.8-25页.pdf
自己根据视频访写的比较实用,大家一起来学习吧
有关各类按钮控件的简单例子,比如Butto、CheckBox等。
欢迎使用Naseej商店的Web应用程序。 这是一个使用Servlet,JSP和Hibernate技术创建的电子商务Web应用程序。 使用Ajax敌对动态网页。 该应用程序是一项完整的电子商务服务,可以注册客户,根据他们的兴趣向他们展示...
面向开发人员的直观,时尚的笔记应用程序。 离线写入 即使您处于离线状态,也可以在笔记本电脑上书写/编辑笔记。 多个设备 Boostnote可用于浏览器,台式机和移动设备。 语法重点 Boostnote可以突出显示100多种...
2、增强了应用程序窗口的功能,可以按照字母排序,按照安装时间排序,增加了多种显示风格 3、增加了隐藏应用功能,在任何应用上面长按,菜单中选择隐藏,即可隐藏您的重要应用。您可以在应用程序的文件菜单中打开...
gis开发图标大全(包括最新时尚大图标),以上海地图为例,里面包含有GIS开发的很多图标,像放大、缩小、漫游等.ico、.jpg、.bmp的都有
MFC Windows 程序设计之时尚文本编辑控件,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福
MFC Windows 程序设计之自定义时尚列表控件,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的...