次の方法で共有


アプリの一時停止を処理する

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

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

ハンドラー内で非同期呼び出しを行うと、その非同期呼び出しから直ちに制御が返されます。 つまり、非同期呼び出しがまだ完了していない場合でも、実行はイベント ハンドラーから戻り、アプリは次の状態に移行します。 イベント ハンドラーに渡される 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 を使用して一時停止イベントを送信できます。 デバッグの場所 ツール バーが表示されていることを確認し、[一時停止] アイコンをクリックします。