앱 일시 중단 처리

중요 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);
}

일시 중단 전에 애플리케이션 데이터 저장

앱이 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 디바이스, 외부 디바이스, 네트워크 리소스 등이 있습니다. 전용 리소스 및 파일 핸들을 명시적으로 해제하면 앱이 일시 중단되어 있는 동안 다른 앱으로 액세스할 수 있게 하는 데 도움이 됩니다. 앱이 재개되면 전용 리소스 및 파일 핸들을 다시 가져와야 합니다.

설명

사용자가 다른 앱 또는 데스크톱 또는 시작 화면으로 전환할 때마다 시스템이 앱을 일시 중단합니다. 사용자가 이 앱으로 다시 전환할 때마다 시스템이 해당 앱을 다시 시작합니다. 시스템이 앱을 다시 시작할 경우, 변수 및 데이터 구조의 콘텐츠는 시스템이 앱을 일시 중단하기 전과 동일합니다. 시스템은 앱을 중단된 위치에서 정확하게 복원합니다. 따라서 해당 앱은 백그라운드에서 실행 중인 것처럼 사용자에게 표시됩니다.

시스템에서는 앱이 일시 중단된 동안 해당 앱과 그 데이터를 메모리에 저장하려고 시도합니다. 그러나 앱을 메모리에 저장할 리소스가 시스템에 없으면 시스템이 앱을 종료합니다. 사용자가 이전에 종료되어 일시 중단된 앱으로 다시 전환하면 시스템에서 Activated(활성화됨) 이벤트를 전송하고, OnLaunched 메서드에서 애플리케이션 데이터를 복원해야 합니다.

시스템은 앱이 종료되는 시기를 앱에 알리지 않습니다. 그러므로 앱을 통해 애플리케이션 데이터를 저장하고, 일시 중단될 때 전용 리소스 및 파일 핸들을 해제했다가 종료 후 앱이 활성화될 때 해당 리소스 및 파일 핸들을 복원해야 합니다.

처리기 내에서 비동기 호출을 하면 해당 비동기 호출에서 컨트롤이 즉시 반환됩니다. 즉 이 실행은 이벤트 처리기에서 반환될 수 있으며, 비동기 호출이 아직 완료되지 않은 경우에도 앱이 다음 상태로 이동합니다. 반환된 Windows.Foundation.Deferral 개체에서 Complete(완료) 메서드를 호출할 때까지 일시 중단을 지연시키려면 이벤트 처리기에 전달되는 EnteredBackgroundEventArgs 개체의 GetDeferral 메서드를 사용하세요.

지연을 실행하더라도 앱을 종료하기 전에 코드를 실행해야 하는 시간이 늘어나지는 않습니다. 지연의 Complete(완료) 메서드가 호출되거나 기한이 경과할(둘 중 먼저 도달하는 시기) 때까지만 종료가 지연됩니다. 일시 중단 상태에서 시간을 연장하려면 ExtendedExecutionSession을 사용합니다.

참고 항목

Windows 8.1에서 시스템 응답을 향상시키기 위해 앱에는 일시 중단 시 리소스에 대한 낮은 우선 순위 액세스 권한이 제공됩니다. 이 새로운 우선 순위를 지원하기 위해, 앱이 Windows의 정상 우선 순위에 해당하는 5초 제한 시간 또는 Windows Phone의 1~10초 동안 실행되도록 일시 중단 작업 시간 제한이 연장됩니다. 이 시간 제한 범위는 연장하거나 변경할 수 없습니다.

Visual Studio를 이용한 디버깅에 관한 참고 사항: Visual Studio는 Windows가 디버거에 연결된 앱을 일시 중단하지 못하게 합니다. 이는 앱이 실행되는 동안 사용자가 Visual Studio 디버그 UI를 볼 수 있게 하기 위한 조치입니다. 앱을 디버깅하려는 경우에는 Visual Studio를 사용해서 일시 중단 이벤트를 앱으로 전송할 수 있습니다. 디버그 위치 도구 모음이 표시되는지 확인한 다음 일시 중단 아이콘을 클릭하세요.