孙广东 2015.8.24
本主题介绍了 Windows 运行时应用的生命周期,从部署它一直到删除它。通过正确地启动、挂起和恢复你的应用,可确保客户拥有最佳应用体验。
此图表现了应用执行状态之间的转换。我们在后面几部分中介绍了这些状态和事件。有关每个状态转换以及你的应用应如何响应的详细信息,请参阅有关 ApplicationExecutionState 枚举的参考文档。
为了能够以任何方式激活应用,必须先对其进行部署。在以下情况下应特别注意进行基本部署:当用户安装你的应用时,或者当你使用 Visual Studio 以在开发和测试期间本地构建并运行自己的应用时。有关此部署以及高级部署方案的详细信息,请参阅应用包和部署。
每当用户激活一个应用而且该应用进程之前处于 NotRunning 状态时,它就会启动。应用可能处于 NotRunning 状态,原因有:它从未启动、它运行后出现了故障,或者它被挂起后无法保留在内存中而被系统终止。
当应用启动时,Windows 显示应用的一个初始屏幕。若要配置此初始屏幕,请参阅“添加初始屏幕”(HTML 或 XAML)。
当初始屏幕显示时,应用代码还应该确保该应用已准备好向用户显示其用户界面。应用的主要任务是注册事件处理程序和设置它需要加载初始页面的任何自定义 UI。这些任务仅应占用几秒的时间。如果某个应用需要从网络请求数据或者需要从磁盘检索大量的数据,这些活动应在激活以外完成。应用在等待完成这些长时间运行的操作时,可以使用自己的自定义加载 UI 或延长的初始屏幕。有关详细信息,请参阅“如何延长初始屏幕”(HTML 或 XAML)以及初始屏幕示例。在应用完成激活后,它将进入 Running 状态,随后初始屏幕将消失(并且其所有资源和对象将被清除)。显示一个窗口、从激活处理程序返回,以及完成一定的延期,这些是应用完成激活的具体方式。有关详细信息,请参阅“如何激活应用”(HTML 或 XAML)。
应用可以由用户通过各种合约和扩展激活。若要参与激活,则必须将你的应用注册为接收 WinJS activated 事件 (HTML) 或覆盖 OnActivated 方法 (XAML)。(对于 HTML,WebUIApplication.activated 是另一个可用于处理激活的事件。)
你的应用的激活代码可以通过测试了解其激活原因以及是否已经处于 Running 状态。应用可以使用以下任意激活类型进行激活:
Activation type | 描述 |
---|---|
缓存的文件 | 用户希望保存你的应用对其进行内容管理的文件。 |
相机 | 用户希望通过所连的相机拍照或捕获视频。 |
联系人选取器 | 用户希望挑选联系人。 |
设备 | 用户希望你的应用能处理自动播放。 |
文件 | 用户的应用启动一个文件,该文件的类型是应用已注册可处理的类型。 |
文件打开选取器 | 用户希望挑选应用提供的文件或文件夹。 |
文件保存选取器 | 用户希望保存文件并选择了你的应用。 |
启动 | 用户启动应用或点击一个内容磁贴。 |
打印任务 | 用户希望你的应用处理打印任务。 |
协议 | 用户的应用启动一个 URL,其协议是应用已注册可处理的协议。 |
搜索 | 用户希望搜索你的应用。 |
共享目标 | 用户希望你的应用作为共享操作的目标。 |
为 Windows 8.1 及更高版本构建的应用可以使用上述任意方式激活,也可以使用这些激活类型激活。
Activation type | 描述 |
---|---|
添加约会 | 用户希望向其日历中添加约会。还在 Windows Phone 上受支持。 |
删除约会 | 用户希望从其日历中删除约会。还在 Windows Phone 上受支持。 |
替换约会 | 用户希望替换其日历中的约会。还在 Windows Phone 上受支持。 |
显示期限 | 用户希望在其日历上显示特定的期限。还在 Windows Phone 上受支持。 |
呼叫联系人 | 用户希望呼叫联系人。 |
定位联系人 | 用户希望定位联系人(获取联系人的位置)。 |
向联系人发送消息 | 用户希望向联系人发送消息。 |
发布联系人 | 用户希望发布联系人。 |
通过视频呼叫联系人 | 用户希望通过视频呼叫联系人。 |
锁屏通话 | 用户希望在锁屏状态下接受呼叫。 |
限制启动 | 用户启动了受限制的应用。 |
使用这些类型可以激活 Windows Phone 应用。
Activation type | 描述 |
---|---|
VoiceCommand | 作为语音命令的结果,已激活应用程序。 |
PickerReturned | 选择选取器后,应用程序已被激活。 |
WalletAction | 已激活应用程序以执行电子钱包操作。 |
PickFileContinuation | 为文件选取器操作挂起应用后,应用程序已被激活。 |
PickSaveFileContinuation | 为文件保存选取器操作挂起应用后,应用程序已被激活。 |
PickFolderContinuation | 为文件夹选取器操作挂起应用后,应用程序已被激活。 |
WebAuthenticationBrokerContinuation | 为 Web 身份验证代理操作挂起应用后,应用程序已被激活。 |
当操作系统终止你的应用后用户又重新启动它时,你的应用可以使用激活还原以前保存的数据。Windows 在应用挂起后可能出于一些原因而将其终止。用户可以手动关闭你的应用或者注销,否则系统的资源可能不足。如果用户在 Windows 终止你的应用之后启动它,该应用将收到一个 activated 事件 (HTML) 或 Application.OnActivated 回调 (XAML),并且用户将看到应用的初始屏幕,直到该应用激活为止。你可以通过此事件确定你的应用是否需要还原其在上次挂起时保存的数据,或者是否必须加载应用的默认数据。由于初始屏幕已出现,因此你的应用代码可以在不明显拖延用户时间的情况下花费一些处理时间来完成此激活操作,然而在重新启动或继续该操作时前面所提到的关于运行时间较长的操作的问题仍存在。activated/OnActivated 事件数据包括一个 PreviousExecutionState 属性,用于告诉你应用在激活之前处于哪种状态。此属性是 ApplicationExecutionState 枚举中的值之一:
终止原因 | PreviousExecutionState 属性的值 | 采取的操作 |
---|---|---|
已由系统终止(例如,因为资源限制) | Terminated | 还原会话数据 |
被用户关闭或被用户终止进程 | ClosedByUser | 使用默认数据启动 |
意外终止,或者应用在当前用户会话期间未运行 | NotRunning | 使用默认数据启动 |
PreviousExecutionState 还可能有 Running 或 Suspended 值,但在这些情况下,你的应用不是之前终止的,因此不必担心还原数据。
注意
如果你使用计算机的管理员帐户登录,则你将无法激活任何 Windows 运行时应用。
有关详细信息,请参阅应用扩展。
在 XAML 激活模型和 Application 类 中,可使用 OnActivated 方法来处理所有可能的激活类型。但是,更常见的做法是使用不同的方法来处理最常见的激活类型,而对于不太常见的激活类型,则仅使用 OnActivated 作为回滚方法。例如, Application 具有 OnLaunched 方法,用于在 ActivationKind 是 Launch 时作为回调进行调用,这是适用于大多数应用的典型激活方法。有超过 6 种 On* 方法可用于特定的激活:OnCachedFileUpdaterActivated、OnFileActivated、OnFileOpenPickerActivated、OnFileSavePickerActivated、OnSearchActivated 和 OnShareTargetActivated。XAML 应用的起始模板具有一个针对 OnLaunched 的实现和一个适用于 Suspending 的处理程序,并且兼具每个模板中预定义的 SuspensionManager
类中的这两种合并方法。对于 SuspensionManager
的作用的描述在本主题的范围内;有关详细信息,请参阅适用于应用的 C#、VB 和 C++ 项目模板。
应用可在用户离开它或设备进入电量不足状态时挂起。大部分应用会在用户离开它们时挂起。
当用户将一个应用移动到后台时,Windows 将等待几秒,以查看用户是否打算立即返回该应用。如果用户在此时间段内没有切换回,Windows 将挂起该应用。
如果应用已经为 WinJS checkpoint 事件(适用于 HTML)或 Application.Suspending 事件(适用于 XAML)注册一个事件处理程序,则在要挂起该应用之前调用此代码。你可以使用事件处理程序保存相关应用和用户数据。我们建议使用应用程序数据 API 完成此目的,因为它们可保证在应用进入 Suspended 状态之前完成工作。有关详细信息,请参阅使用 Windows 运行时访问应用数据。你还应释放独占资源和文件句柄,这样在你的应用没有使用它们时其他应用可以访问。
通常,你的应用应该在处理挂起事件时立即保存其状态并释放其独占资源和文件句柄,并且此代码最多只需 1 秒便可完成工作。如果应用在 Windows 上未在 5 秒内和在 Windows Phone 上未在 1 至 10 秒之间从挂起事件中返回,则 Windows 假设应用已停止响应并终止该应用。
Windows 会尝试在内存中保留尽可能多的挂起应用。通过将这些应用保留在内存中,可确保用户在已挂起的应用之间快速且可靠地切换。但是,如果没有足够的资源将应用保留在内存中,则 Windows 可能会终止你的应用。应用不会收到它们被终止的通知,所以你保存应用数据的唯一机会是在挂起期间。当应用确定它在终止后被激活时,它应该加载它在挂起期间保存的应用数据,以使其按照被挂起前的方式运行。
有些应用必须继续运行才能完成后台任务。例如,你的应用可以在后台继续播放音频;有关详细信息,请参阅“如何在后台播放音频”(HTML 或 XAML)。此外,即使你的应用挂起甚至终止,后台传输操作仍将继续;有关详细信息,请参阅“如何下载文件”(HTML 或 XAML)。
有关指南,请参阅应用挂起和恢复指南。
有关示例代码,请参阅“如何挂起应用”(HTML 或 XAML)。
当用户从你的应用切换到其他应用时,你的应用将不再可见,但仍保持 Running 状态,直到 Windows 可以挂起它为止。如果用户离开你的应用,但在挂起它之前又激活或返回到该应用,它会保持 Running 状态。
当应用可见性更改时,你的应用不会收到激活事件,因为它仍在运行中。Windows 只需根据需要来回切换应用即可。如果你的应用需要在用户离开和返回时执行某些操作,则可以处理 visibilitychange 事件 (HTML) 或 Window.VisibilityChanged 事件 (XAML)。
可见性事件不按挂起/恢复或激活事件排序。不要假定这些事件按特定的顺序传入。
挂起的应用在用户切换到该应用或设备从电量不足状态恢复时恢复。
有关应用在恢复时所处状态的枚举,请参阅 ApplicationExecutionState。应用从 Suspended 状态恢复时,它会进入 Running 状态并从挂起的位置和时间处继续运行。 不会丢失任何应用数据,但前提是数据是保存在内存中的。因此,大多数应用在恢复时不需要执行任何操作。但是,应用可能挂起数小时甚至数天。因此,如果应用拥有可能已过时的内容或网络连接,这些内容或网络连接应该在应用恢复时刷新。如果应用已经为 WebUIApplication.resuming 事件 (HTML) 或 Application.Resuming 事件 (XAML) 注册一个事件处理程序,则在应用从 Suspended 状态恢复时调用它。你可以使用该事件处理程序刷新应用内容和数据。
具体而言,HTML 应用通常不需要专门处理 resuming,因为 activated 将在相同的情况下触发。你可以使用 activated 事件数据中的 ActivationKind 信息来确定是否恢复应用;此模式在起始项目模板的 default.js 文件中显示。
如果挂起的应用被激活以加入一个应用合约或扩展,它会首先收到 Resuming 事件,然后收到 Activated 事件。
当应用挂起时,它不会收到它注册接收的网络事件。这些事件没有排队,所以它们会丢失。因此,你的应用应该在恢复时测试网络状态。
有关指南,请参阅应用挂起和恢复指南。
有关示例代码,请参阅“如何恢复应用”(HTML 或 XAML)。
注意 在 Windows Phone 应用商店应用的 XAML 应用中,每次用户从“开始”磁贴或应用列表启动应用时都会调用 OnLaunched,即便该应用当前在内存中已挂起也是如此。在 Windows 上,从“开始”磁贴或应用列表启动挂起的应用不会调用此方法。
通常,用户不需要关闭应用,他们可以让 Windows 管理它们。但是,用户可以选择以下方法来关闭应用:使用关闭手势,在 Windows 上按 Alt+F4,或在 Windows Phone 上使用任务切换器。你不能在应用中包括任何 UI 以让用户关闭应用,否则该应用不会通过应用商店的认证过程。
没有任何特殊事件指示用户已关闭应用。
在用户关闭应用之后,它将被挂起并终止,然后进入 NotRunning 状态。
在 Windows 8.1 以及更高版本中,在用户关闭应用之后,该应用将从屏幕中移除并切换列表,但并未显式终止。
注意 如果你的应用依赖于 Windows 8 的用户关闭行为,则在将系统升级到 Windows 8.1 时可在此应用中启用此行为。若要启用 Windows 8 的用户关闭行为,请使用 ApplicationView.TerminateAppOnFinalViewClose 属性将你的 Windows 8.1 应用设置为在最后一个窗口关闭后终止。
如果应用已经为 Suspending 事件注册了一个事件处理程序,当应用被挂起时则会调用该处理程序。你可以使用此事件处理程序将相关应用程序和用户数据保存到持久性存储中。
用户关闭行为: 建议你决定当用户关闭应用后再激活应用时,应用具有的行为。应用被 Windows 终止或被用户终止可能没有任何区别。如果应用在被用户关闭时需要执行与被 Windows 关闭时不同的操作,你可以使用激活事件处理程序确定应用是被用户终止的还是被 Windows 终止的。请参阅 ApplicationExecutionState 枚举参考中 ClosedByUser 和 Terminated 状态的说明。如果你要维护一个 Windows 8 应用,请注意处理 ClosedByUser 的方式可能与 Windows 8.1 应用所使用的方式不同。
我们建议,应用不要以编程方式自行关闭,除非绝对必要。例如,如果应用检测到内存泄漏,它可以关闭自己来确保用户个人数据的安全。当你以编程方式关闭应用时,系统会将此视为应用崩溃。
应用需要遵守系统故障体验,只需返回到“开始”屏幕。系统故障体验旨在让用户尽快返回执行的操作,因此不应提供警告对话框或其他通知,因为这会拖延用户的时间。应用消失应清楚地告诉用户出现了问题。
如果你的应用出现故障、停止响应或者发生意外,Windows 将请求用户同意向 Microsoft 发送问题报告。Microsoft 在问题报告中向你提供错误数据的一个子集,这样你可以使用这些数据改进你的应用。你可以在“仪表板”中应用的“质量”页面中看到此数据。
当用户在应用出现故障之后激活该应用时,其激活事件处理程序将收到 NotRunning 的 ApplicationExecutionState 值,并且将显示其初始 UI 和数据。崩溃后,请勿经常使用原本将用于 Resuming 和 Suspended 的应用数据,因为该数据可能已损坏;请参阅应用挂起和恢复指南。
当用户删除你的应用时,会一同删除应用及其所有本地数据。删除应用不会影响存储在公用位置的用户数据,例如文档或图片库中的文件。
对于 HTML 或 XAML 应用,在起始 Visual Studio 项目模板中提供了与应用生命周期相关的基本代码。基本代码可处理启动激活,甚至可以在添加任何你自己的代码之前显示其主要 UI。