处理应用暂停

重要的 API

了解当系统挂起你的应用时如何保存重要的应用程序数据。 该示例为 Suspending 事件注册事件处理程序,并将字符串保存到文件中。

注册暂停的事件处理程序

注册以处理 Suspending 事件,该事件指示应用应在系统挂起应用程序数据之前保存其应用程序数据。

using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;

partial class MainPage
{
   public MainPage()
   {
      InitializeComponent();
      Application.Current.Suspending += new SuspendingEventHandler(App_Suspending);
   }
}
Public NotInheritable Class MainPage

   Public Sub New()
      InitializeComponent()
      AddHandler Application.Current.Suspending, AddressOf App_Suspending
   End Sub
   
End Class
MainPage::MainPage()
{
    InitializeComponent();
    Windows::UI::Xaml::Application::Current().Suspending({ this, &MainPage::App_Suspending });
}
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace AppName;

MainPage::MainPage()
{
   InitializeComponent();
   Application::Current->Suspending +=
       ref new SuspendingEventHandler(this, &MainPage::App_Suspending);
}

在挂起之前保存应用程序数据

当应用处理 挂起 事件时,它有机会在处理程序函数中保存其重要的应用程序数据。 应用应该使用 LocalSettings 存储 API 来同步保存简单的应用程序数据。

partial class MainPage
{
    async void App_Suspending(
        Object sender,
        Windows.ApplicationModel.SuspendingEventArgs e)
    {
        // TODO: This is the time to save app data in case the process is terminated.
    }
}
Public NonInheritable Class MainPage

    Private Sub App_Suspending(
        sender As Object,
        e As Windows.ApplicationModel.SuspendingEventArgs) Handles OnSuspendEvent.Suspending

        ' TODO: This is the time to save app data in case the process is terminated.
    End Sub

End Class
void MainPage::App_Suspending(
    Windows::Foundation::IInspectable const& /* sender */,
    Windows::ApplicationModel::SuspendingEventArgs const& /* e */)
{
    // TODO: This is the time to save app data in case the process is terminated.
}
void MainPage::App_Suspending(Object^ sender, SuspendingEventArgs^ e)
{
    // TODO: This is the time to save app data in case the process is terminated.
}

释放资源

应释放独占资源和文件句柄,以便其他应用在应用暂停时可以访问它们。 独占资源的示例包括相机、I/O 设备、外部设备和网络资源。 显式释放独占资源和文件句柄有助于确保在应用暂停时其他应用可以访问它们。 恢复应用后,它应重新获取其独占资源和文件句柄。

注解

每当用户切换到其他应用或桌面或“开始”屏幕时,系统就会暂停你的应用。 每当用户切回到你的应用时,系统就会恢复你的应用。 当系统恢复你的应用时,你的变量和数据结构的内容与系统将你的应用暂停之前的内容相同。 系统会将你的应用完全恢复到你离开时的状态,使用户感觉你的应用好像一直在后台运行一样。

当你的应用暂停时,系统会尝试将你的应用及其数据保留在内存中。 但是,如果系统没有资源将你的应用保存在内存里,则将终止你的应用。 当用户切换回已终止的挂起应用时,系统会发送已激活事件,并在 OnLaunched 方法中还原其应用程序数据。

当终止应用时系统不会通知应用,因此当暂停应用时,你的应用必须保存其应用程序数据并释放独占资源和文件句柄,并且在终止后又激活应用时还原这些内容。

如果在处理程序中进行异步调用,控件会立即从该异步调用返回。 这意味着,即使异步调用尚未完成,执行也可以从事件处理程序返回,并且应用将移动到下一个状态。 在传递给事件处理程序的 EnteredBackgroundEventArgs 对象上使用 GetDeferral 方法,以延迟挂起,直到对返回的 Windows.Foundation.Deferral 对象调用 Complete 方法之后。

延迟不会增加在应用终止之前运行代码所需的时间。 它只会延迟终止,直到调用延迟的 Complete 方法,或最后期限通过(以先到第一者为准)。 若要延长挂起状态的时间,请使用 ExtendedExecutionSession

注意

为了改进 Windows 8.1 中的系统响应,在应用暂停时,我们为应用提供低优先级的资源访问。 为了支持这一新优先级,暂停操作超时会延长,使应用在 Windows 上具有 5 秒的正常优先级的等效超时,或者在 Windows Phone 上的 1 到 10 秒之间。 不能延长或更改此超时窗口。

有关使用 Visual Studio 进行调试的注释: Visual Studio 阻止 Windows 挂起附加到调试器的应用。 这是允许用户在应用运行时查看 Visual Studio 调试 UI。 调试应用时,可以使用 Visual Studio 将其发送到暂停事件。 请确保“调试位置”工具栏显示出来,然后单击“暂停”图标