次の方法で共有


ユニバーサル Windows プラットフォーム (UWP) アプリのライフサイクル

このトピックでは、ユニバーサル Windows プラットフォーム (UWP) アプリが起動されてから終了するまでのライフサイクルについて説明します。

少しの歴史

Windows 8 より前は、アプリのライフサイクルは単純でした。 Win32 アプリと .NET アプリが実行されているか、実行されていません。 ユーザーが最小化したり、ユーザーから切り替えたりすると、ユーザーは引き続き実行されます。 ポータブル デバイスと電源管理がますます重要になるまで、これは問題ありません。

Windows 8 では、UWP アプリを使用した新しいアプリケーション モデルが導入されました。 大まかに言うと、新しい中断状態が追加されました。 UWP アプリは、ユーザーがアプリを最小化するか、別のアプリに切り替えた直後に中断されます。 つまり、オペレーティング システムでリソースを再利用する必要がない限り、アプリのスレッドは停止され、アプリはメモリに残ります。 ユーザーがアプリに戻ると、すぐに実行中の状態に復元できます。

バックグラウンド タスク 想定される実行、アクティビティスポンサー実行など、バックグラウンドでアプリを引き続き実行する必要があるさまざまな方法があります (たとえば、BackgroundMediaEnabled アプリはバックグラウンドでメディアを再生できます)。 また、アプリが中断または終了した場合でも、バックグラウンド転送操作を続行できます。 詳細については、「 ファイルのダウンロード方法を参照してください。

既定では、フォアグラウンドにないアプリは中断されます。 これにより、現在フォアグラウンドのアプリで使用できるリソースが削減され、リソースが増えます。

中断状態では、リソースを解放するためにオペレーティング システムが中断されたアプリを終了する場合があるため、開発者にとって新しい要件が追加されます。 終了したアプリは引き続きタスク バーに表示されます。 ユーザーがそれをクリックすると、ユーザーはシステムがアプリを閉じたことに気付かないので、アプリは終了前の状態を復元する必要があります。 彼らは、他のことをしている間、バックグラウンドで待機していると考え、それを離れたときと同じ状態になると予想します。 このトピックでは、これを実現する方法について説明します。

Windows 10 バージョン 1607 では、さらに 2 つのアプリ モデル状態が導入されました。フォアグラウンドでの実行バックグラウンドでの実行。 以下のセクションでは、これらの追加の状態について説明します。

アプリの実行状態

この図は、Windows 10 バージョン 1607 以降で可能なアプリ モデルの状態を表しています。 UWP アプリの一般的なライフサイクルを見てみましょう。

アプリの実行状態間の遷移を示す状態図

アプリは、起動またはアクティブ化されると、実行中の状態になります。 フォアグラウンド アプリの起動のためにアプリをフォアグラウンドに移動する必要がある場合、アプリは LeavingBackground イベントを取得します。

"起動済み" と "アクティブ化済み" は似た用語のように見えるかもしれませんが、オペレーティング システムがアプリを起動するさまざまな方法を指します。 まず、アプリの起動を見てみましょう。

アプリの起動

OnLaunched メソッドは、アプリの起動時に呼び出されます。 LaunchActivatedEventArgs パラメーターが渡されます。このパラメーターは、特に、アプリに渡される引数、アプリを起動したタイルの識別子、およびアプリが存在していた以前の状態を提供します。

LaunchActivatedEventArgs.PreviousExecutionState からアプリの以前の状態を取得します。この状態は、ApplicationExecutionState を返します。 その値と、その状態のために実行する適切なアクションは次のとおりです。

ApplicationExecutionState 説明 実行するアクション
NotRunning アプリは、ユーザーが前回再起動またはログインしてから起動されていないため、この状態になる可能性があります。 また、実行中であってもクラッシュした場合や、ユーザーが以前に閉じたために、この状態になる場合もあります。 現在のユーザー セッションで初めて実行されているかのようにアプリを初期化します。
一時停止 ユーザーはアプリを最小化または切り替えたが、数秒以内にアプリに戻らなかった。 アプリが中断されると、その状態はメモリに残りました。 必要なのは、アプリが中断されたときに解放したファイル ハンドルまたはその他のリソースを再取得することだけです。
終了 アプリは以前は中断されていましたが、システムがメモリを再利用する必要があるため、ある時点でシャットダウンされました。 ユーザーが切り替えたときにアプリが存在していた状態を復元します。
ClosedByUser ユーザーが、システムの [閉じる] ボタンまたは Alt + F4 キーを使用してアプリを閉じました。 ユーザーがアプリを閉じると、アプリは最初に中断され、次に終了されます。 アプリは基本的に終了状態に至るのと同じ手順を実行しているため、終了状態と同じように処理します。
実行中 ユーザーがもう一度起動しようとしたときに、アプリは既に開かれていました。 Nothing。 アプリの別のインスタンスが起動されないことに注意してください。 既に実行中のインスタンスは、単にアクティブ化されます。

Note

現在のユーザー セッション は Windows ログオンに基づいています。 現在のユーザーが Windows をログオフ、シャットダウン、または再起動していない限り、現在のユーザー セッションは、ロック画面認証、ユーザー切り替えなどのイベント間で保持されます。

注意すべき重要な状況の 1 つは、デバイスに十分なリソースがある場合、オペレーティング システムは、応答性を最適化するために、その動作をオプトインした頻繁に使用されるアプリを事前に起動することです。 事前起動されたアプリはバックグラウンドで起動された後、ユーザーがアプリに切り替えたときに再開できるように、アプリを起動するよりも迅速に中断されます。

事前起動のため、アプリの OnLaunched() メソッドはユーザーではなく、システムによって開始される可能性があります。 アプリはバックグラウンドで事前起動されるため、 OnLaunched()で別のアクションを実行する必要がある場合があります。 たとえば、アプリの起動時に音楽の再生を開始した場合、アプリはバックグラウンドで事前起動されるため、どこから来たのかはわかりません。 アプリがバックグラウンドで事前起動されると、その後に Application.Suspending の呼び出しが行われます。 次に、ユーザーがアプリを起動すると、再開イベントと、 OnLaunched() メソッドが呼び出されます。 事前起動シナリオの処理方法の詳細については、「 Handle アプリの事前起動 」を参照してください。 オプトインするアプリのみが事前起動されます。

Windows を起動すると、アプリのスプラッシュ画面が表示されます。 スプラッシュ画面を構成するには、「 スプラッシュスクリーンの追加を参照してください。

スプラッシュ画面が表示されている間、アプリはイベント ハンドラーを登録し、初期ページに必要なカスタム UI を設定する必要があります。 アプリケーションのコンストラクターや OnLaunched() で実行されているこれらのタスクが数秒以内に完了することを確認してください。さもないと、システムはアプリを無応答と見なして終了する可能性があります。 アプリがネットワークからデータを要求する必要がある場合、またはディスクから大量のデータを取得する必要がある場合は、起動の外部でこれらのアクティビティを完了する必要があります。 アプリは、実行時間の長い操作が完了するまで待機している間、独自のカスタム読み込み UI または拡張スプラッシュ画面を使用できます。 詳細については、「スプラッシュ画面を表示する」とSplash 画面のサンプルを参照してください。

アプリの起動が完了すると、 Running 状態になり、スプラッシュ画面が消え、スプラッシュ画面のすべてのリソースとオブジェクトがクリアされます。

アプリのアクティブ化

ユーザーが起動するのとは対照的に、アプリはシステムによってアクティブ化できます。 アプリは、共有コントラクトなどのコントラクトによってアクティブ化される場合があります。 または、カスタム URI プロトコルまたはアプリが処理するために登録されている拡張子を持つファイルを処理するようにアクティブ化することもできます。 アプリをアクティブ化する方法の一覧については、「 ActivationKind」を参照してください。

Windows.UI.Xaml.Application クラスは、アプリをアクティブ化するさまざまな方法を処理するためにオーバーライドできるメソッドを定義します。 OnActivated は、考えられるすべてのアクティブ化の種類を処理できます。 ただし、最も一般的なアクティブ化の種類を処理するために特定のメソッドを使用し、あまり一般的でないアクティブ化の種類のフォールバック メソッドとして OnActivated を使用する方が一般的です。 特定のアクティブ化のための追加の方法を次に示します。

OnCachedFileUpdaterActivated
OnFileActivated
OnFileOpenPickerActivated OnFileSavePickerActivated
OnSearchActivated
OnShareTargetActivated

これらのメソッドのイベント データには、上で見たのと同じ PreviousExecutionState プロパティが含まれています。これは、アクティブ化される前のアプリの状態を示しています。 App launchセクションで前述したのと同じ方法で状態と何を行うべきかを解釈します。

コンピューターの管理者アカウントを使用してログオンする場合、UWP アプリをアクティブ化することはできません。

バックグラウンドでの実行

Windows 10 バージョン 1607 以降では、アプリはアプリ自体と同じプロセス内でバックグラウンド タスクを実行できます。 詳細については、単一プロセス モデルを使用した Background アクティビティを参照してください。 この記事ではインプロセスバックグラウンド処理を行いませんが、これがアプリのライフサイクルにどのように影響するかは、アプリがバックグラウンドにあるときに関連する 2 つの新しいイベントが追加されていることです。 EnteredBackgroundLeavingBackground です。

これらのイベントには、ユーザーがアプリの UI を表示できるかどうかも反映されます。

バックグラウンドでの実行は、アプリケーションが起動、アクティブ化、または再開される既定の状態です。 この状態では、アプリケーション UI はまだ表示されません。

フォアグラウンドでの実行

フォアグラウンドで実行すると、アプリの UI が表示されます。

LeavingBackground イベントは、アプリケーション UI が表示される直前、およびフォアグラウンド状態で実行に入る直前に発生します。 また、ユーザーがアプリに戻ったときにも発生します。

以前は、UI アセットを読み込むのに最適な場所は、 Activated または Resuming イベント ハンドラーでした。 これで LeavingBackground は、UI の準備ができていることを確認するのに最適な場所です。

これは、アプリケーションがユーザーに表示される前に作業を行う最後の機会であるため、この時点までにビジュアルアセットの準備ができていることを確認することが重要です。 このイベント ハンドラーのすべての UI 作業は、ユーザーが経験する起動時間と再開時間に影響を与えるため、迅速に完了する必要があります。 LeavingBackground は、UI の最初のフレームの準備が整っていることを確認する時間です。 その後、イベント ハンドラーが返されるように、実行時間の長いストレージまたはネットワーク呼び出しを非同期的に処理する必要があります。

ユーザーがアプリケーションから切り替えると、アプリはバックグラウンド状態で実行中を再入力します。

バックグラウンド状態の再入力

EnteredBackground イベントは、アプリがフォアグラウンドで表示されなくなったことを示します。 デスクトップ EnteredBackground では アプリが最小化されているときに起動します。電話では、ホーム画面または別のアプリに切り替えるときに発生します。

アプリのメモリ使用量を減らす

アプリはユーザーに表示されなくなったため、UI のレンダリング作業とアニメーションを停止するのに最適な場所です。 LeavingBackground を使用して、その作業を再開できます。

バックグラウンドで作業を行う場合は、ここで準備します。 MemoryManager.AppMemoryUsageLevelを確認し必要に応じて、アプリがバックグラウンドで実行されているときに使用されるメモリの量を減らして、リソースを解放するためにシステムによって終了されるリスクを軽減することをお勧めします。

詳細については、「 アプリがバックグラウンド状態になったときのメモリ使用量を する」を参照してください。

状態を保存する

中断イベント ハンドラーは、アプリの状態を保存するのに最適な場所です。 ただし、バックグラウンドで作業を行う場合 (たとえば、オーディオ再生、拡張実行セッションまたはインプロセス バックグラウンド タスクを使用する場合)、 EnteredBackground イベント ハンドラーから非同期的にデータを保存することをお勧めします。 これは、バックグラウンドで優先度が低い状態でアプリが終了する可能性があるためです。 その場合、アプリは中断状態を通過しないため、データは失われます。

バックグラウンド アクティビティが開始される前に、 EnteredBackground イベント ハンドラーにデータを保存すると、ユーザーがアプリをフォアグラウンドに戻すときに優れたユーザー エクスペリエンスが確保されます。 アプリケーション データ API を使用して、データと設定を保存できます。 詳しくは、「設定と他のアプリ データを保存して取得する」をご覧ください。

データを保存した後、メモリ使用量の上限を超えている場合は、後で再読み込みできるため、メモリからデータを解放できます。 これによって、バックグラウンド アクティビティに必要な資産で使用できるメモリが解放されます。

アプリにバックグラウンド アクティビティが進行中の場合、中断状態に達することなく、バックグラウンド状態の実行中からフォアグラウンド状態の実行中に移動できることに注意してください。

Note

アプリがユーザーによって閉じられると、EnteredBackground イベントの前に OnSuspending イベントが発生する可能性があります。 場合によっては、アプリが終了する前に EnteredBackground イベントが発生しないことがあります。 OnSuspending イベント ハンドラーにデータを保存することが重要です。

非同期作業と遅延

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

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

状態を保存するためにさらに時間が必要な場合は、アプリがバックグラウンド状態に入る前に状態を段階的に保存する方法を調べて、 OnSuspending イベント ハンドラーに保存する量が少ないようにします。 または、 ExtendedExecutionSession を要求して、より多くの時間を取得することもできます。 ただし、要求が許可される保証はないため、状態を保存するために必要な時間を最小限に抑える方法を見つけることをお勧めします。

アプリの中断

ユーザーがアプリを最小化すると、Windows は数秒待って、ユーザーがアプリに切り替えるかどうかを確認します。 この時間枠内に戻らず、拡張実行、バックグラウンド タスク、またはアクティビティスポンサー実行がアクティブでない場合、Windows はアプリを中断します。 そのアプリで拡張実行セッションなどがアクティブでない限り、ロック画面が表示されると、アプリも一時停止されます。

アプリが中断されると、 Application.Suspending イベントが呼び出されます。 Visual Studio の UWP プロジェクト テンプレートは、App.xaml.csOnSuspending と呼ばれるこのイベントのハンドラーを提供しています。 ここにアプリケーションの状態を保存するコードを配置する必要があります。

アプリが中断されている間に他のアプリからアクセスできるように、排他的なリソースとファイル ハンドルを解放する必要があります。 排他的リソースの例としては、カメラ、I/O デバイス、外部デバイス、ネットワーク リソースなどがあります。 排他リソースとファイル ハンドルを明示的に解放すると、アプリが中断されている間に他のアプリからアクセスできるようになります。 アプリが再開されるときに、排他リソースとファイル ハンドルを再取得する必要があります。

期限に注意する

高速で応答性の高いデバイスを確保するために、中断中のイベント ハンドラーでコードを実行する必要がある時間には制限があります。 デバイスごとに異なり、期限と呼ばれる SuspendingOperation オブジェクトのプロパティを使用して何が使用されているかを確認できます。

EnteredBackgroundイベント ハンドラーと同様に、ハンドラーから非同期呼び出しを行うと、その非同期呼び出しから直ちに制御が返されます。 つまり、非同期呼び出しがまだ完了していない場合でも、実行はイベント ハンドラーから戻り、アプリは中断状態に移行します。 SuspendingOperation オブジェクトの GetDeferral メソッド (イベント引数を介して使用できます) を使用して、返された SuspendingDeferral オブジェクトで Complete メソッドを呼び出すまで中断状態の入力を遅延させます

さらに時間が必要な場合は、 ExtendedExecutionSessionを要求できます。 ただし、要求が許可される保証はないため、 Suspended イベント ハンドラーで必要な時間を最小限に抑える方法を見つけることをお勧めします。

アプリの終了

システムは、アプリの一時停止中、アプリとそのデータをメモリに保持するよう試みます。 ただし、システムにアプリをメモリに保持するリソースがない場合は、アプリが終了します。 アプリは終了中であるという通知を受け取らないので、アプリのデータを保存する唯一の機会は、 OnSuspending イベント ハンドラーにあります。

アプリが終了後にアクティブ化されたと判断した場合は、アプリが終了する前と同じ状態になるように、保存したアプリケーション データを読み込む必要があります。 ユーザーが終了した中断されたアプリに戻ると、アプリは OnLaunched メソッドでアプリケーション データを復元する必要があります。 システムは終了時にアプリに通知しないため、アプリはアプリケーション データを保存し、中断される前に排他リソースとファイル ハンドルを解放し、終了後にアプリがアクティブ化されたときに復元する必要があります。

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

アプリの再開

中断されたアプリは、ユーザーがアプリに切り替えたとき、またはデバイスが低電力状態から出たときにアクティブなアプリである場合に再開されます。

アプリが Suspended 状態から再開されると、バックグラウンドで実行 状態になり システムは中断した場所のアプリを復元して、アプリが実行されているかのようにユーザーに表示されるようにします。 メモリに格納されているアプリ データは失われません。 そのため、ほとんどのアプリは再開時に状態を復元する必要はありませんが、中断されたときに解放したファイルまたはデバイス ハンドルを再取得し、アプリが中断されたときに明示的に解放された状態を復元する必要があります。

アプリは何時間も何日も中断される可能性があります。 古くなった可能性のあるコンテンツまたはネットワーク接続がアプリにある場合は、アプリの再開時に更新する必要があります。 アプリが Application.Resuming イベントのイベント ハンドラーを登録した場合、アプリが Suspended 状態から再開されたときに呼び出されます。 このイベント ハンドラーでは、アプリのコンテンツとデータを更新できます。

中断されたアプリがアプリ コントラクトまたは拡張機能に参加するようにアクティブ化されると、最初に Resuming イベント、次に Activated イベントを受け取ります。

中断されたアプリが終了した場合、Resuming イベントはなく、代わりに OnLaunched()TerminatedApplicationExecutionState で呼び出されます。 アプリが中断されたときに状態を保存したため、 OnLaunched() 中にその状態を復元して、切り替えたときと同じようにアプリがユーザーに表示されるようにすることができます。

アプリは一時停止中に、受信するために登録したネットワーク イベントを受信しません。 これらのネットワーク イベントはキューに登録されません。単に見落とされます。 そのため、アプリは再開時にネットワークの状態をテストする必要があります。

注: Resuming イベントは UI スレッドから生成されないため、再開ハンドラー内のコードが UI と通信する場合は、ディスパッチャーを使用する必要があります。 これを行う方法のコード例については、「 バックグラウンド スレッドから UI スレッドを更新する 」を参照してください。

一般的なガイドラインについては、「 Guidelines for app suspend and resumeを参照してください。

アプリを閉じる

一般に、ユーザーはアプリを閉じる必要がなく、Windows でアプリを管理できます。 ただし、ユーザーは、閉じるジェスチャを使用するか、Alt キーを押しながら F4 キーを押すか、Windows Phone のタスク スイッチャーを使用して、アプリを閉じることもできます。

ユーザーがアプリを閉じたことを示すイベントはありません。 ユーザーがアプリを閉じると、状態を保存する機会を与えるために最初に中断されます。 Windows 8.1 以降では、アプリがユーザーによって閉じられた後、アプリは画面と切り替えリストから削除されますが、明示的に終了されません。

ユーザーによって閉じられたときの動作: アプリがユーザーによって閉じられたときに、Windows によって閉じられたときとは異なる動作を実行する必要がある場合は、アクティブ化イベント ハンドラーを使用して、アプリがユーザーまたは Windows のどちらによって終了されたかを判定できます。 ApplicationExecutionState 列挙体のリファレンスで、ClosedByUser および Terminated 状態の説明を参照してください。

絶対に必要でない限り、プログラムでアプリを閉じないことをお勧めします。 たとえば、アプリがメモリ リークを検出した場合、アプリ自体を閉じて、ユーザーの個人データのセキュリティを確保できます。

アプリのクラッシュ

システム クラッシュ エクスペリエンスは、ユーザーができるだけ早く実行していた作業に戻るように設計されています。 警告ダイアログやその他の通知はユーザーを遅らせるので、指定しないでください。

アプリがクラッシュしたり、応答を停止したり、例外が生成されたりした場合、ユーザーの フィードバックと診断の設定に従って、問題レポートが Microsoft に送信されます。 Microsoft では、アプリの改善に使用できるように、問題レポートのエラー データのサブセットを提供しています。 このデータは、ダッシュボードのアプリの [品質] ページで確認できます。

ユーザーがクラッシュした後にアプリをアクティブ化すると、そのアクティブ化イベント ハンドラーは ApplicationExecutionState NotRunning の値を受け取り、その初期 UI とデータを表示する必要があります。 クラッシュ後は、SuspendedResumingに使用したアプリ データを定期的に使用しないでください。データが破損している可能性があるため、アプリの中断と再開については、「Guidelines」を参照してください

アプリの削除

ユーザーがアプリを削除すると、アプリとそのすべてのローカル データが削除されます。 アプリを削除しても、ドキュメントライブラリや画像ライブラリなどの一般的な場所に保存されたユーザーのデータには影響しません。

アプリのライフサイクルと Visual Studio プロジェクト テンプレート

アプリのライフサイクルに関連する基本的なコードは、Visual Studio プロジェクト テンプレートで提供されます。 基本的なアプリは起動のアクティブ化を処理し、アプリ データを復元するための場所を提供し、独自のコードを追加する前でもプライマリ UI を表示します。 詳細については、「 C#、VB、C++ のアプリ用プロジェクト テンプレートを参照してください。

主要なアプリケーション ライフサイクル API