动手实验

实验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. Python 模块(五)

    目录 模块介绍 time &datetime模块 random json & picle 一.模块介绍 在我们日常的程序开发过程中,随着代码越写越多,在单个文件里的代码就会越来越长,越 ...

  2. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  3. Android 蓝牙( Bluetooth)耳机连接分析及实现

    Android 实现了对Headset 和Handsfree 两种profile 的支持.其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它. if ( ...

  4. 插件化-开启另外应用的activity

    1.清单文件 android:sharedUserId="com.zyh.tplugin" 2.视图 <LinearLayout xmlns:android="ht ...

  5. BZOJ 2429: [HAOI2006]聪明的猴子( MST )

    水题, 求MST即可. -------------------------------------------------------------------------------- #includ ...

  6. 一天一个类,一点也不累 之 Set接口

    我们的口号是:一天一个类,一点也不累-- 再次回忆一下集合相关的类图. 官方API上这样介绍这个接口: A collection that contains no duplicate elements ...

  7. VS2013 Qt5 Mysql中文编码问题

    Qt开始默认是utf-8,而VS2013默认程序编码为gb2312: 这样就会发现使用中文的时候乱码. 一般有二种解决方案: 1.在使用中文的时候,使用QTextCodec QTextCodec *g ...

  8. MYSQL中delete删除多表数据与删除关联数据

    在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 ...

  9. 机器时代的中国字幕(Automata.2014.720p.WEB-DL.DD5.1.H264-RARBG.srt)

    看字幕.再也看不下去.自己翻译的位 评价的探讨 1 00:01:58,452 --> 00:02:02,088 人工增雨 期限为32分钟16第二 2 00:02:02,089 --> 00 ...

  10. c# winform 路径选择和文件读写

    //读文件 private void readBtn_Click(object sender, EventArgs e) { try { if (pathTxt.Text == "" ...