动手实验

实验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. svn修改log信息

    在linux下安装了SVN服务器来做版本控制. 有天提交文件忘记了填写SVN提交日志,于是在项目中使用右键,show log,找到我提交的无日志的那条记录,点击右健,选择了“Edit log mess ...

  2. 说服式设计(persuasive design)的行为模型

    转自:http://www.sharetk.com/html/ued/User-Research/1404.html 一 模型简介 BJ Fogg提出了一个新的理解人类行为的模型,他称之为Fogg b ...

  3. 2013年最好的Python开源项目汇总

    2013年Python社区诞生了很多实用的开发工具,这些工具 在一定程度上 可以帮助你节省更多的时间.本文为你汇总了这些工具,它们大部分都是开源的,你还可以通过源码来学习更多的Python开发知识. ...

  4. Use Node.js DDP Client on Arduino Yun to Access Meteor Server

    Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...

  5. vector的成员函数解析

    vector是线性容器,它的元素严格的依照线性序列排序,和动态数组非常相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅能够使用迭代器(iterator)訪问元素,还能够使用指针 ...

  6. 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】

    ucosii原来的禁止中断以及恢复中断的代码是最简的,但是使用之前,必须声明一个固定名为 OS_CPU_SR   cpu_sr 的变量,吊在那里感觉很怪. ;********************* ...

  7. android 网络交互

    一. 在Android中,发送和处理http请求实在太常见了,以至于我们经常需要写这方面的代码. Android中网络交互的代码不能在UI线程中执行,只能在额外的子线程中执行. 我一般的做法是通过创建 ...

  8. Jquery学习笔记:操作form表单元素之一(文本框和下拉框)

    一.概述 在web页面开发中,经常需要获取和设置表单元素的值(如文本框中的内容),特别是在ajax应用中,更是常态.本文系统的介绍下如何操作. 同操作其它html元素一样,操作的过程差不多. 第一步, ...

  9. 设计模式(三)建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  10. P65

    #include<stdio.h> #define N 6 main() { char c[N]; int i=0; for(;i<N;c[i]=getchar(),i++); pr ...