アプリの中断の処理

重要な 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 Storage 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 メソッドでそのアプリケーション データを復元する必要があります。

アプリが終了されるときは、システムはアプリに通知を送らないので、アプリは中断されたときにアプリケーション データを保存し、排他リソースとファイル ハンドルを解放して、アプリが終了後アクティブ化されるときにそれらを復元する必要があります。

ハンドラー内で非同期呼び出しを行うと、その非同期呼び出しから直ちに制御が返されます。 つまり、非同期呼び出しがまだ完了していない場合でも、実行はイベント ハンドラーから戻り、アプリは次の状態に移行します。 イベント ハンドラーに渡される EnteredBackgroundEventArgs オブジェクトの GetDeferral メソッドを使用して、返された Windows.Foundation.Deferral オブジェクトで Complete メソッドを呼び出した後まで中断を遅延させます。

遅延によって、アプリが終了するまでにコードを実行する必要がある時間は長くならありません。 遅延の Complete メソッドが呼び出されるか、期限に達するまで、終了が遅れるだけです。 中断状態で時間を延長するには、 ExtendedExecutionSession を使用します。

Note

Windows 8.1 でシステムの応答性を向上させるために、アプリには中断後にリソースへの優先度の低いアクセスが与えられます。 この新しい優先度をサポートするために、中断操作のタイムアウトが拡張され、アプリは Windows の通常の優先度の 5 秒のタイムアウト、または Windows Phone では 1 ~ 10 秒のタイムアウトに相当します。 このタイムアウト 期間を延長または変更することはできません。

Visual Studio: Visual Studio を使用したデバッグに関する注意事項により、デバッガーにアタッチされているアプリが Windows によって中断されなくなります。 これは、アプリの実行中にユーザーが Visual Studio デバッグ UI を表示できるようにするためです。 アプリをデバッグする場合は、Visual Studio を使用して一時停止イベントを送信できます。 Debug の場所ツールバーが表示されていることを確認し、Suspend アイコンをクリックします。