动手实验

实验5:进程生命周期管理

2012年9月

简介

进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一。不同于传统的Windows应用(它们即使在后台仍然继续执行),Windows应用商店应用仅在前台时执行。通常不可见的应用程序被操作系统挂起并且不能被执行直到操作系统将它恢复到前台。

当应用程序被挂起,它仍然在内存中,同时它的所有线程被挂起。只要进程仍然在内存中,当应用程序回到前台时,它将从停止的地方继续执行。要做到这一点开发者不需要做任何工作。然而您不能被保证进程一直在内存中。如果当应用程序被挂起时,Windows内核决定需要挂起应用程序所使用的内存,Windows可以终止挂起的应用程序。当应用程序被终止时,所有未保存的状态将被丢失。除非您采取步骤以保持状态,否则当用户返回应用程序并发现所有已完成的工作被丢失时将会非常吃惊。

显然我们不会允许它发生。当应用程序被挂起时,即使Windows也不知道应用程序是否最终将被终止。您应当假定应用程序将被终止,因此您必须编写代码以在它被挂起时保存应用程序的状态。然后如果您检测到应用程序被挂起时有一个终止发生,您可以在重新激活时恢复状态。

听起来很麻烦?有时是,但是对大多数应用程序来说不是,并且这是您编写优秀应用程序必须做的工作。不做上述工作的潜在代价是仅仅切换到另一个应用程序就会丢失他或她在您应用程序中所做的所有工作。

目标

本实验将向您介绍进程生命周期管理并向您展示Visual Studio在缺省模版中为您编写的一些代码。因为Contoso食谱是一个简单的应用程序,所以我们不需要编写新的代码来处理进程生命周期管理,Visual Studio注入的代码已经足够。您可能必须为自己的应用程序编写更多的代码,因此我们将告诉您代码的位置以及您可以使用哪些应用程序接口(API)。停止打字并坐下来休息一下,但是请务必集中注意力。

 

 

系统要求

您需要下列软件完成本实验:

  • Microsoft Windows 8
  • Microsoft Visual Studio 2012

设置

您必须执行以下步骤来准备本实验的计算机:

  1. 安装Microsoft Windows 8。
  2. 安装Microsoft Visual Studio 2012。

练习

本动手实验包含以下练习:

  1. 导航状态已经被保存
  2. 提示

练习1:导航状态已经被保存

因为在Contoso Cookbook中唯一需要保存的状态是导航状态(即用户查看的项或组以及导航历史),您不需要为处理进程生命周期管理做任何工作。Visual Studio在您的应用程序中包含一个名称为SuspensionManager的类,它位于项目Common文件夹的SuspensionManager.cs中。Visual Studio同时在App.xaml.cs中的App构造函数中包含一行代码,它为Suspending事件注册了一个事件处理程序。如此处所示,处理程序OnSuspending调用SuspensionManager.SaveAsync以保存应用程序的导航状态。

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
await SuspensionManager.SaveAsync();
deferral.Complete();
}

Visual Studio在App.xaml.cs文件的OnLaunched事件中包含一个if子句,它的作用是如果应用程序在被挂起后被操作系统终止,则恢复应用程序的导航状态。

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
// Restore the saved session state only when appropriate
await SuspensionManager.RestoreAsync();
}

所有这些工作的结果是您可以免费获得很多东西。如果Contoso Cookbook被挂起并终止,当再次被启动时,它将自动转至您最后查看的页面。您可以通过按F5从Visual Studio运行应用程序,选择某个食谱并从此处所示的Debug Location调试位置)工具栏选择Suspend and shutdown挂起并关闭)以对其进行测试。

在以这种方式关闭应用程序后按F5以重新启动应用程序。以上操作对由操作系统终止并重新启动应用程序的过程进行了模拟。得益于Visual Studio创建的代码,应用程序将返回您关闭应用程序时查看的食谱。因为导航历史也被恢复,您甚至可以使用返回按钮回溯您在应用中的步骤。

练习2:提示

我们强烈建议您熟悉Visual Studio中的Suspend(挂起), Resume(继续), 和Suspend and shutdown(挂起并关闭)命令。这是调试应用程序进程生命周期管理状态的很好的方法。如果您仅仅通过启动应用程序并切换任务以使应用程序进入或退出前台的方法调试进程生命周期管理,大多数时候都能得到预想的结果。但是对于终止您将不能看到正确的行为。您将看到应用程序停留在内存的时间比预想的要长,因为Visual Studio调试器进行了一些处理以保持与应用程序的连接。对终止事件请使用Visual Studio中的Suspend and shutdown 命令。

决定进程生命周期管理需要保存的内容同样十分重要。在下一个实验中我们将讨论设置(或称为用户首选项)并且您将注意到当用户输入或修改设置时我们将立刻保存它们。为进程生命周期管理保存的状态应该是一个帮助您恢复用户至应用程序挂起前位置的“瞬时”状态。其他任何需要保存的内容(例如设置或缓存)应该根据需要越早保存越好。这种做法将减少在进程生命周期管理的挂起事件中您需要完成的工作量。

总结

对于优秀的Windows应用商店应用,为进程生命周期管理处理SuspendResume事件是必须的。在Contoso Cookbook实验中我们不需要为此做很多工作,因为我们需要保存的所有内容就是导航历史。在您的应用程序中,可能需要做一些额外的工作。本实验向您介绍了Visual Studio生成的代码以及进程生命周期的基础设施。对于Contoso Cookbook还有很多工作需要完成。下一个实验将向您展示如何使用设置超级按钮保存用户首选项。让我们继续前行。

Windows 8 动手实验系列教程 实验5:进程生命周期管理的更多相关文章

  1. Windows 8 动手实验系列教程 实验6:设置和首选项

    动手实验 实验6:设置和首选项 2012年9月 简介 实验3介绍了合约并演示了应用程序如何轻松地与共享和搜索合约实现集成.合约同样包含设置超级按钮,它对活动的Windows应用商店应用的设置进行修改. ...

  2. Windows 8 动手实验系列教程 实验8:Windows应用商店API

    动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商店.考虑到世界范围内目前有超过 ...

  3. Windows 8 动手实验系列教程 实验7:磁贴和通知

    动手实验 实验7:磁贴和通知 2012年9月 简介 磁贴是Windows应用商店应用用户体验的重要元素.当应用程序被安装后,它的磁贴将在Windows 8开始屏幕被创建.该磁贴(称为主磁贴)作为启动应 ...

  4. 快速构建Windows 8风格应用30-应用生命周期管理

    原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止) ...

  5. React 深入系列4:组件的生命周期

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...

  6. Laravel大型项目系列教程(二)之用户管理

    Laravel大型项目系列教程(二) 一.前言 本节教程将大概实现用户的注册.修改个人信息.管理用户功能. 二.Let's go 1.创建用户注册视图 $ php artisan generate:v ...

  7. react实战 系列 —— React 的数据流和生命周期

    其他章节请看: react实战 系列 数据流和生命周期 如何处理 React 中的数据,组件之间如何通信,数据在 React 中如何流动? 常用的 React 生命周期方法以及开源项目 spug 中使 ...

  8. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  9. Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!

    maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...

随机推荐

  1. Stackful 协程库 libgo(单机100万协程)

    libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库. 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第 ...

  2. ASP.NET MVC 5 学习教程:数据迁移之添加字段

    原文 ASP.NET MVC 5 学习教程:数据迁移之添加字段 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符 ...

  3. WM_PAINT消息小结

    WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第 ...

  4. App状态管理-AppDelegate

    前面提到AppDelegate的实例在UIApplicationMain函数中被创建并调用. AppDelegate的主要作用,可以从其继承类可以看出 class AppDelegate:UIResp ...

  5. BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

    匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. --------------------------------------------------------------- ...

  6. win7(64位)php5.5-Apache2.4-环境安装

    一.安装配置Apache2.4.7(httpd-2.4.7-win64-VC11.zip ) 1.解压下载的安装包:httpd-2.4.12-x64-vc11-r2.zip将其放到自己的安装目录(我的 ...

  7. Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  8. lokijs

    http://lokijs.org/#/ 500,000+ 1.1M ops/s. A fast, in-memory document-oriented datastore for node.js, ...

  9. linux c setitimer使用方法说明

    在linux c编程中.setitimer是一个比較经常使用的函数.可用来实现延时和定时的功能,网上有各种零零散散的使用方法说明,都仅仅提到了个别使用方法,今天抽出时间实践整理了一份比較具体的: 使用 ...

  10. opencv视频播放

    在一个界面上显示一张图片.是一件非常easy的事情,但说到要显示视频.刚開始学习的人可能不知道怎么处理,事实上,一般来说能够理解为视频就是图片以人眼察觉不到的速度高速更新. 曾经用摄像头採集视频显示在 ...