アプリのライフサイクル

アプリのライフサイクル

[この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、 「最新のドキュメント」をご覧ください]

このトピックでは、Windows ランタイム アプリのライフサイクル (アプリが展開されたときから、アプリが削除されるまで) について説明します。アプリの起動、中断、再開を適切に行うことで、アプリの利用者に最善のエクスペリエンスを提供します。

アプリの実行状態

次の図は、アプリの実行状態が切り替わるようすを示したものです。このページの以降のセクションで、これらの状態とイベントについて説明します。各状態に切り替わる状況とその際のアプリの処理について詳しくは、ApplicationExecutionState 列挙体に関するリファレンスをご覧ください。

アプリの実行状態が切り替わるようすを示す状態図

展開

どのような方法でアプリをアクティブ化する場合でも、まずアプリを展開する必要があります。基本的な展開は、ユーザーがアプリをインストールする場合、または開発時やテスト時に Visual Studio を使ってアプリをビルドしたり実行したりする場合に備えて準備されます。基本的な展開や高度な展開のシナリオについて詳しくは、「アプリ パッケージと展開」をご覧ください。

アプリの起動

アプリは、そのプロセスが NotRunning 状態であるときにユーザーがアプリをアクティブ化すると起動します。アプリが NotRunning 状態である理由としては、アプリがまだ起動されていないこと、アプリが実行中にクラッシュしたこと、またはアプリは中断されたがメモリに残すことができずにシステムによって終了されたことなどが考えられます。

アプリの起動時には、アプリのスプラッシュ画面が表示されます。このスプラッシュ画面を構成するには、「スプラッシュ画面の追加 (HTML)」または「スプラッシュ画面の追加 (XAML)」をご覧ください。

スプラッシュ画面の表示中、アプリ コードでは、アプリがユーザー インターフェイスを表示できるように準備する必要があります。アプリの主なタスクに、イベント ハンドラーを登録して、初期ページの読み込みに必要なカスタム UI を設定するタスクがあります。これらのタスクは数秒で完了する必要があります。ネットワーク経由でデータを要求したり、ディスクから大量のデータを取得したりする必要がある場合、こうしたアクティビティはアクティブ化とは別に実行してください。このような実行に時間がかかる操作が完了するまでの間、アプリでは、アプリ独自のカスタム読み込み UI や追加のスプラッシュ画面を使うことができます。詳しくは、「スプラッシュ画面を拡張する方法 (HTML)」、「スプラッシュ画面を拡張する方法 (XAML)」、およびスプラッシュ画面のサンプルに関するページをご覧ください。アプリのアクティブ化が完了すると、アプリが Running 状態になり、スプラッシュ画面は消えます (スプラッシュ画面のすべてのリソースとオブジェクトは消去されます)。具体的には、ウィンドウを表示し、アクティブ化ハンドラーから復帰して、保留を終了すると、アプリのアクティブ化は完了します。詳しくは、「アプリをアクティブ化する方法 (HTML)」または「アプリをアクティブ化する方法 (XAML)」をご覧ください。

アプリのアクティブ化

アプリはさまざまなコントラクトや拡張機能からアクティブ化されます。アクティブ化の状態にするには、WinJS activated イベントを受け取るか (HTML)、OnActivated メソッドをオーバーライドするように (XAML)、アプリを登録する必要があります (HTML の場合、WebUIApplication.activated がアクティブ化を処理できるもう一つのイベントです)。

アプリのアクティブ化コードを使うと、アクティブ化された理由を確認したり、既に Running 状態になっているかどうかを確認したりすることができます。アプリは、次のアクティブ化の種類に基づいてアクティブ化できます。

アクティブ化の種類 説明
キャッシュされたファイルユーザーがこのアプリで提供されるコンテンツ管理の対象ファイルを保存しようとする。
カメラユーザーが接続したカメラから写真またはビデオをキャプチャしようとする。
連絡先選択ツールユーザーが連絡先を選ぼうとする。
デバイスユーザーがこのアプリで自動再生を処理しようとする。
ファイルこのアプリで処理するように登録されている種類のファイルをユーザーのアプリが起動した。
ファイル オープン ピッカーユーザーがこのアプリで提供されるファイルまたはフォルダーを選ぼうとする。
ファイル保存ピッカーユーザーがファイルを保存しようとし、このアプリを選んだ。
起動ユーザーがこのアプリを起動した、またはコンテンツ タイルをタップした。
印刷タスクユーザーがこのアプリで印刷タスクを処理しようとする。
プロトコルこのアプリで処理するように登録されているプロトコルの URL をユーザーのアプリが起動した。
検索ユーザーがこのアプリで検索しようとする。
共有ターゲットユーザーがこのアプリを共有操作のターゲットにしようとする。

 

Windows 8.1 以降向けにビルドされたアプリは、上に示したようにアクティブ化できますが、次のアクティブ化の種類に基づいてアクティブ化することもできます。

アクティブ化の種類 説明
予定の追加ユーザーがカレンダーに予定を追加しようとする。Windows Phone でもサポートされています。
予定の削除ユーザーがカレンダーから予定を削除しようとする。Windows Phone でもサポートされています。
予定の置換ユーザーがカレンダーの予定を置換しようとする。Windows Phone でもサポートされています。
期間の表示ユーザーがカレンダーの特定の期間を表示しようとする。Windows Phone でもサポートされています。
連絡先への電話ユーザーが連絡先に電話をかけようとする。
連絡先の地図ユーザーが連絡先の地図 (住所) を得ようとする。
連絡先へのメッセージユーザーが連絡先にメッセージを送ろうとする。
連絡先への投稿ユーザーが連絡先に投稿しようとする。
連絡先へのビデオ通話ユーザーが連絡先とビデオ通話をしようとする。
ロック画面での通話ユーザーがロック画面から電話を受けようとする。
制限された起動ユーザーが制限されたアプリを起動した。

 

Windows Phone アプリは、次の種類でアクティブ化することができます。

アクティブ化の種類 説明
VoiceCommand 音声コマンドの結果としてアプリケーションがアクティブ化された。
PickerReturned ピッカーの完了後にアプリケーションがアクティブ化された。
WalletAction ウォレット操作を実行するためにアプリケーションがアクティブ化された。
PickFileContinuation ファイル ピッカー操作のためにアプリケーションが中断された後、アプリケーションがアクティブ化された。
PickSaveFileContinuation ファイル保存ピッカー操作のためにアプリケーションが中断された後、アプリケーションがアクティブ化された。
PickFolderContinuation フォルダー ピッカー操作のためにアプリケーションが中断された後、アプリケーションがアクティブ化された。
WebAuthenticationBrokerContinuation Web 認証ブローカー操作のためにアプリケーションが中断された後、アプリケーションがアクティブ化された。

 

オペレーティング システムがアプリを終了させた後でユーザーが再びアプリを起動した場合は、アクティブ化するときに、保存されていたデータを復元することができます。Windows では、アプリの中断後、さまざまな理由でアプリを終了することがあります。たとえば、ユーザーが手動でアプリを閉じたときやサインアウトしたとき、システムのリソースが足りないときなどです。Windows がアプリを終了させた後でユーザーがアプリを起動した場合、アプリは activated イベント (HTML) または Application.OnActivated コールバック (XAML)を受け取ります。ユーザーには、アプリがアクティブ化されるまで、アプリのスプラッシュ画面が表示されます。このイベントを使って、前回中断されたときに保存されていたデータを復元する必要があるかどうか、アプリの既定のデータを読み込む必要があるかどうかを判断できます。スプラッシュ画面が表示されているため、アプリのコードでは、ユーザーが気になるような遅延を発生させずに、ある程度の処理時間を費やしてこのイベントの処理を実行できます。ただし、アプリの再起動や継続を行うときには、前に説明した実行に時間がかかる操作に関する対応方法も考慮してください。activated イベント データや OnActivated イベント データには PreviousExecutionState プロパティが含まれており、アプリがアクティブ化される前の状態を確認することができます。このプロパティの値は、ApplicationExecutionState 列挙体のいずれかの値になります。

終了した理由 PreviousExecutionState プロパティの値実行する処理
システムによる終了 (リソースの制約などによる)Terminated セッション データを復元する
ユーザーによる終了 (ユーザーによるプロセスの終了)ClosedByUser 既定のデータで起動する
予期しない終了 (現在のユーザー セッションの間にアプリが実行されていない)NotRunning既定のデータで起動する

 

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

PreviousExecutionState の値が Running または Suspended になる場合もありますが、その場合はアプリは終了されていないため、データを復元する必要はありません。

  

コンピューターの管理者アカウントを使ってログオンしている場合は、Windows ランタイム アプリをアクティブ化できません。

詳しくは、「アプリの拡張機能」をご覧ください。

OnActivated と XAML アプリでの特定のアクティブ化との比較

XAML のアクティブ化モデルと Application クラスでは、OnActivated メソッドが、発生する可能性があるすべてのアクティブ化の種類を処理するための方法となります。ただし、最も一般的なアクティブ化の種類を処理する場合は別のメソッドを使い、あまり一般的ではないアクティブ化の種類を処理する際の代替手段としてのみ OnActivated を使うことが多くあります。たとえば、Application には、ActivationKindLaunch である場合にコールバックとして呼び出される OnLaunched メソッドがあります。このメソッドが、ほとんどのアプリで使われる一般的なアクティブ化の方法です。特定のアクティブ化については、さらに 6 つの On* メソッドがあります。それらは、OnCachedFileUpdaterActivatedOnFileActivatedOnFileOpenPickerActivatedOnFileSavePickerActivatedOnSearchActivatedOnShareTargetActivated です。XAML アプリの開始テンプレートは、OnLaunched の実装および Suspending のハンドラーを備えています。これらの組み込みメソッドはどちらも、各テンプレートで事前に定義されている SuspensionManager クラスのメソッドです。SuspensionManager に関する説明は、このトピックでは扱いません。詳しくは、「アプリ用の C#、VB、C++ プロジェクト テンプレート」をご覧ください。

アプリの一時停止

ユーザーがアプリを切り替えた場合、またはデバイスが低電力状態に切り替わった場合にアプリを中断できます。多くのアプリは、ユーザーがアプリを切り替えると中断されます。

ユーザーがアプリをバックグラウンドに移行すると、Windows は、ユーザーがすぐにこのアプリに戻るかどうかを確かめるために数秒待機します。この時間枠内にアプリに戻らなかった場合、アプリは中断されます。

アプリに WinJS checkpoint イベント (HTML) または Application.Suspending イベント (XAML) のイベント ハンドラーが登録されている場合は、アプリが中断される直前にこのイベント ハンドラーのコードが呼び出されます。このイベント ハンドラーを使って、関連するアプリ データとユーザー データを保存できます。この場合は、アプリ データ API を使うことをお勧めします。アプリ データ API は、アプリが Suspended 状態になる前に必ず完了するためです。詳しくは、「Windows ランタイムを使ったアプリ データへのアクセス」をご覧ください。また、排他リソースとファイル ハンドルを、自分のアプリが使っていないときに他のアプリがアクセスできるように解放することをお勧めします。

一般に、アプリは中断イベントを処理するとすぐに、その状態を保存し、排他リソースとファイル ハンドルを解放します。コードでは、この処理を 1 秒以内で完了させる必要があります。アプリが中断イベントから Windows で 5 秒以内、Windows Phone で 1 ~ 10 秒以内に復帰しなかった場合、Windows はアプリが応答を停止したと判断してアプリを終了します。

Windows は、中断したアプリをできるだけ多くメモリに保持するよう試みます。これらのアプリをメモリに保持することで、ユーザーが中断したアプリをすばやく簡単に切り替えられるようになります。ただし、十分なリソースがなくアプリをメモリに保持できない場合は、アプリが終了されることがあります。個々のアプリは終了通知を受け取らないため、アプリが中断されるタイミングがアプリのデータを保存する唯一のチャンスとなります。終了後にアプリをアクティブ化するとき、中断する前と同様にアプリが機能するように、中断時に保存したアプリのデータがアプリに読み込まれます。

アプリのシナリオによっては、バックグラウンド タスクを完了するためにアプリの実行を継続する必要があります。たとえば、アプリではオーディオの再生をバックグラウンドで継続できます。詳しくは、「バックグラウンドでオーディオを再生する方法 (HTML)」または「バックグラウンドでオーディオを再生する方法 (XAML)」をご覧ください。また、バックグラウンドの転送処理は、アプリが中断または終了した場合でも引き続き実行されます。詳しくは、「ファイルのダウンロード方法 (HTML)」または「ファイルのダウンロード方法 (XAML)」をご覧ください。

ガイドラインについては、「アプリの一時停止と再開のガイドライン」をご覧ください。

コード例については、「アプリを中断する方法 (HTML)」または「アプリを中断する方法 (XAML)」をご覧ください。

アプリの表示

ユーザーがアプリを別のアプリに切り替えると、元のアプリは表示されなくなりますが、Windows によって中断されるまでは Running 状態が維持されます。ユーザーがアプリを切り替えても、中断される前にそのアプリをアクティブ化したり再びそのアプリに切り替えた場合は、アプリは Running 状態のままになります。

アプリの表示が切り替わったときは、アプリは実行状態のままであるため、アクティブ化イベントを受け取りません。必要に応じて、Windows でアプリの切り替えだけが行われます。ユーザーがアプリを切り替えたときに何かの処理を行う必要がある場合は、アプリで visibilitychange イベント (HTML) または Window.VisibilityChanged イベント (XAML) を処理できます。

表示イベントは、中断イベント、再開イベント、またはアクティブ化イベント共にシリアル化されません。これらのイベントが特定の順序で発生すると想定しないでください。

アプリの再開

中断中のアプリは、ユーザーがそのアプリに切り替えた場合、またはデバイスが低電力状態から復帰した場合に再開されます。

アプリが再開されたときのアプリの状態については、ApplicationExecutionState 列挙体を確認してください。アプリを Suspended 状態から再開すると、アプリは Running 状態になり、中断された時点から再開されます。 アプリのデータはメモリに格納されているため失われません。したがって、ほとんどのアプリでは、再開時に処理を行う必要はありません。ただし、アプリは長時間一時停止している可能性があります。そのため、アプリのコンテンツやネットワーク接続が無効になっていると考えられる場合は、アプリの再開時にコンテンツやネットワーク接続を更新する必要があります。アプリに WebUIApplication.resuming イベント (HTML) または Application.Resuming イベント (XAML) のイベント ハンドラーが登録されている場合は、アプリが Suspended 状態から再開されるとこのイベント ハンドラーが呼び出されます。このイベント ハンドラーを使ってアプリのコンテンツやデータを更新できます。

  

通常、HTML アプリでは resuming を特に処理する必要はありません。これは、同じ状況で activated が発生するためです。activated イベント データの ActivationKind の情報を使って、アプリが再開しているかどうかを判断できます。このパターンは、プロジェクト開始テンプレートの default.js ファイルに示されています。

 

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

一時停止中、アプリは受信登録したネットワーク イベントを受け取っていません。これらのイベントはキューに入れられず、受け取ることができません。そのため、再開時にアプリでネットワーク ステータスをテストする必要があります。

ガイドラインについては、「アプリの一時停止と再開のガイドライン」をご覧ください。

コード例については、「アプリを再開する方法 (HTML)」または「アプリを再開する方法 (XAML)」をご覧ください。

  Windows Phone ストア アプリの XAML アプリでは、OnLaunched は、ユーザーがスタート画面のタイルやアプリの一覧からアプリを起動するたびに呼び出されます (アプリが現在中断されてメモリに残っている場合も含む)。Windows では、スタート画面のタイルまたはアプリの一覧から中断中のアプリを起動するときに、このメソッドが呼び出されることはありません。

アプリを閉じる

一般に、アプリを閉じる処理はユーザーが行う必要はなく、Windows で管理されます。ただし、ユーザーはジェスチャを使うか、Windows で Alt + F4 キーを押すか、Windows Phone でタスク スイッチャーを使って、アプリを閉じることができます。アプリを閉じるための UI をアプリに組み込むことはできません。アプリを閉じる UI を組み込むと、ストアの認定プロセスで不合格になります。

ユーザーがアプリを閉じたことを示す専用のイベントはありません。

ユーザーがアプリを閉じると、中断された後に終了され、NotRunning 状態になります。

Windows 8.1 以降では、ユーザーがアプリを閉じても、アプリは明示的に終了されるのではなく、画面と切り替えリストから消えるだけです。

  Windows 8 のユーザーによって閉じられた際の挙動にアプリが依存している場合は、Windows 8.1 にアップグレードするときにこの挙動をアプリで有効にすることができます。Windows 8 でユーザーによって閉じられた際の挙動を有効にするには、ApplicationView.TerminateAppOnFinalViewClose プロパティを使って、最後のウィンドウが閉じられたときに Windows 8.1 アプリが終了するように設定することができます。

アプリに Suspending イベントのイベント ハンドラーが登録されている場合は、アプリが一時停止されるとこのイベント ハンドラーが呼び出されます。このイベント ハンドラーを使って、関連するアプリ データとユーザー データを固定ストレージに保存できます。

ユーザーが閉じた場合の動作:  ユーザーがアプリを閉じた後にそのアプリがアクティブ化されるときの動作を決めることをお勧めします。アプリが Windows によって終了されたか、またはユーザーが終了したかは、大きな違いにはなりません。ユーザーがアプリを閉じたときに、Windows によって閉じられたときとは異なる動作にする必要がある場合は、アクティブ化イベント ハンドラーを使って、アプリをユーザーが終了したか、または Windows によって終了されたかを特定できます。ApplicationExecutionState 列挙体に関するリファレンスの ClosedByUser 状態と Terminated 状態の説明をご覧ください。Windows 8 アプリを維持するときは、ClosedByUser の処理が Windows 8.1 アプリでの処理とは異なる場合があることに注意してください。

必要でない限り、アプリをプログラムで閉じないことをお勧めします。たとえば、メモリ リークが検出された場合などは、ユーザーの個人データのセキュリティを確保するためにアプリ自体で閉じてもかまいません。アプリをプログラムで閉じると、システムではアプリのクラッシュとして処理されます。

アプリのクラッシュ

アプリがクラッシュしたときは、単純にスタート画面に戻るというシステム クラッシュのエクスペリエンスに従う必要があります。システム クラッシュのエクスペリエンスは、ユーザーがそれまで行っていた作業にできるだけ迅速に戻れるようにすることを目的としています。そのため、ユーザーを待たせることがないように、警告ダイアログなどによる通知は行わないでください。アプリが消えれば、問題が起こったことはユーザーにもはっきりわかります。

アプリがクラッシュしたり、応答しなくなったり、例外が生成されたりすると、ユーザーに Microsoft への問題レポートの送信を求めるメッセージが表示されます。Microsoft は、アプリの改善に役立つように、問題レポートに含まれるエラー データの一部を提供しています。このデータは、ダッシュボードに表示されるアプリの [品質] ページで確認できます。

アプリがクラッシュした後でユーザーがアプリをアクティブ化すると、アクティブ化イベント ハンドラーは ApplicationExecutionState の値として NotRunning を受け取り、アプリの最初の UI とデータを表示します。クラッシュの後、Suspended に基づく Resuming で使ったアプリ データはそのまま使わないでください。これは、そのデータが破損している可能性があるためです。「アプリの中断と再開のガイドライン」をご覧ください。

アプリの削除

ユーザーがアプリを削除すると、アプリはすべてのローカル データと共に削除されます。アプリの削除は、一般的な場所に格納されているユーザーのデータ (ドキュメント ライブラリやピクチャ ライブラリ内のファイルなど) には影響しません。

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

HTML アプリまたは XAML アプリについては、アプリのライフ サイクルに関連する基本的なコードは、Visual Studio の開始プロジェクト テンプレートに用意されています。基本的なアプリでは、起動アクティブ化を処理し、独自のコードを追加する前であってもプライマリ UI を表示します。詳しくは、「ストア アプリ用 JavaScript プロジェクト テンプレート」または「アプリ用の C#、VB、C++ プロジェクト テンプレート」をご覧ください。

アプリケーションのライフサイクルに関する主要な API

関連トピック

アプリの一時停止と再開のガイドライン
アプリのアクティブ化、再開、中断の例 (JavaScript)

 

 

表示:
© 2017 Microsoft