处理应用暂停

重要的应用程序接口(API)

了解如何在系统暂停应用时保存重要的应用程序数据。 该示例为 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 向其发送一个暂停事件。 确保显示 调试位置 工具栏,然后单击 暂停 图标。