情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 のアプリのアクティブ化および非アクティブ化

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

このトピックでは、Windows Phone アプリのライフサイクルと、アプリでアクティブ化と非アクティブ化を処理する方法について説明します。Windows Phone では、常に 1 つのアプリだけがフォアグラウンドで実行されます。これは、ユーザーが積極的に使用しているアプリが、スムースで応答性に優れた使用感を実現するために必要なリソースを確保できるようにするためです。一度に 1 つのアプリだけがフォアグラウンドで実行されるため、ユーザーがアプリから離れると、その離れ方とコンテキストに基づいて、アプリは一時停止するか終了します。Windows Phone アプリケーション モデルは、アプリのアクティブ化と非アクティブ化で、一貫した直感的なユーザー エクスペリエンスを提供できるようにする、一連のイベントと関連 API を提供します。

メモメモ:

位置情報を認識するアプリは、バックグラウンドで実行しながら位置をアクティブに追跡できます。詳細については、「Windows Phone 8 のバックグラウンドで位置追跡アプリを実行する方法」を参照してください。

このトピックは、次のセクションで構成されています。

次の図に、Windows Phone アプリケーションのライフサイクルを示します。この図で、円はアプリケーションの状態を表しています。四角形は、アプリケーションがその状態を管理する必要があるアプリケーション レベルまたはページ レベルのイベントを示しています。

Execution Model Diagram for Windows Phone 7.5

このセクションでは、Windows Phone アプリのアプリケーション ライフサイクルについて説明し、各ステップでアプリが実行する必要があるアクションを示します。また、PhoneApplicationPage オブジェクトおよび PhoneApplicationService オブジェクトのイベントとプロパティを紹介します。これらのオブジェクトは、Windows Phone に含まれているすべての Windows Phone SDK マネージ アプリケーション プロジェクト テンプレートの一部として提供されます。これらの API を使用するコード例については、「Windows Phone 8 のページの状態を保持および復元する方法」および「Windows Phone 8 のアプリの状態を保持および復元する方法」を参照してください。アプリケーションで実行する必要があるイベントおよびアクションの簡単なチェックリストについては、「実行モデルのイベントとアプリケーション アクションの概要」を参照してください。

Launching イベント

ユーザーは、インストールされているアプリケーションの一覧または [スタート] のタイルからアプリを選択することにより、アプリの新しいインスタンスを起動できます。また、アプリに関連付けられているトースト通知をタップする、Photos Extras メニューからアプリを選択する、などの他の方法でアプリの新しいインスタンスを起動することもできます。このようにして起動されたアプリでは、アプリの新しいインスタンスが起動したことをユーザーに明確に伝えるユーザー インターフェイスを表示する必要があります。ユーザーがアプリで最近表示したドキュメントの一覧など、ユーザーの以前のエクスペリエンスに関するコンテキストを表示することはかまいませんが、以前に実行していたインスタンスに戻っているかのような表示は避ける必要があります。

アプリの新しいインスタンスが起動すると、Launching イベントが発生します。アプリがすばやく読み込まれるようにするために、このイベントのハンドラーで実行するコードはできるだけ少なくする必要があります。具体的には、ファイル操作やネットワーク操作など、リソースを集中的に使用するタスクは避けます。最良のユーザー エクスペリエンスを実現するには、これらのタスクを、アプリが読み込まれた後にバックグラウンド スレッドで実行します。

実行

起動後は、アプリが実行されています。アプリは、ユーザーが前に進むか、アプリから離れるか、アプリの最初のページを越えて前に戻るまで実行し続けます。Windows Phone アプリでは、中止または終了するメカニズムをユーザーに提供しません。アプリは、アプリケーションのアイドル検出を無効にしていなければ、電話がロック画面になったときにも実行状態から抜けます。詳細については、「Windows Phone 8 のアイドル検出」を参照してください。

OnNavigatedFrom メソッド

OnNavigatedFrom(NavigationEventArgs) メソッドは、ユーザーがアプリのいずれかのページから離れるたびに呼び出されます。このメソッドは、アプリケーション内での通常のページ移動の結果として呼び出されることがありますが、ユーザーがアプリから離れた場合にも呼び出されます。このメソッドが呼び出されるたびに、アプリケーションではページの状態を格納する必要があります。これにより、ユーザーがそのページに戻った場合、そのページが既にメモリ内に存在しなくても、ページを復元できるようにします。例外は、後ろへの移動です。NavigationMode プロパティを使用すると、移動が後ろへの移動であるかどうかを判断できます。後ろへの移動の場合、ページは次回表示されるときに再作成されるので、状態を保存する必要はありません。

場合によっては、OnNavigatingFrom(NavigatingCancelEventArgs) メソッドでも状態を保存する必要があります。具体的には、MediaElement コントロールの状態を格納するために、ページの状態を保存する必要があります。

Deactivated イベント

Deactivated イベントは、ユーザーが [スタート] ボタンを押すかまたは別のアプリケーションを起動することにより、前に移動してアプリから離れたときに発生します。Deactivated イベントは、アプリケーションがセレクターを起動した場合にも発生します。セレクターの詳細については、「Windows Phone 8 のランチャーとセレクター」を参照してください。このイベントは、アプリケーションのアイドル検出が無効になっていなければ、デバイスがロック画面になった場合にも発生します。

Deactivated イベントのハンドラーでは、保存されていないすべてのアプリケーション データを保存し、後で必要に応じて復元できるようにする必要があります。 Windows Phone アプリケーションには、アプリケーション状態を格納するために使用できるディクショナリである State オブジェクトが用意されています。以下に説明するように、オペレーティング システムはアプリを破棄する場合、このディクショナリを保存します。アプリが再アクティブ化されると、オペレーティング システムはディクショナリを返します。

アプリケーションは、Deactivated が呼び出された後に完全に終了することも可能です。アプリケーションが終了する場合、アプリケーションの状態ディクショナリは保存されません。そのため、Deactivated イベント中に、アプリケーション インスタンス間で持続させる必要がある未保存の状態も分離ストレージに格納する必要があります。

休止

ユーザーが前に移動し、アプリから離れると、Deactivated イベントの発生後、オペレーティング システムはアプリを休止状態にしょうと試みます。この状態では、アプリケーションのすべてのスレッドが停止し、処理が行われませんが、アプリケーションはメモリ内にそのまま残ります。アプリが休止状態から再度アクティブ化された場合は、状態が保存されているため、アプリは状態を再確立するための処理を実行する必要がありません。

アプリが休止状態になった後に新しいアプリが起動し、それらのアプリケーションで良好なユーザー エクスペリエンスを提供するために必要なメモリが使用可能なメモリの量を上回る場合、オペレーティング システムは休止状態のアプリケーションを破棄してメモリを解放します。

破棄

破棄状態のアプリは既に終了していますが、その移動状態と、Deactivated 中にアプリが設定した状態ディクショナリは、オペレーティング システムによって保存されています。デバイスは、一度に最大 5 つのアプリの破棄情報を維持します。アプリが破棄され、ユーザーがそのアプリに戻った場合、アプリは再起動され、保存されたデータを使用して状態を復元できます。

Activated イベント

Activated イベントは、ユーザーが休止状態または破棄状態のアプリに戻ったときに発生します。アプリでは、イベントの引数である IsApplicationInstancePreserved プロパティを調べて、休止状態から戻っているのか、破棄状態から戻っているのかを判断する必要があります。IsApplicationInstancePreserved が true の場合、アプリは休止状態から戻っており、状態がオペレーティング システムによって自動的に保存されています。false の場合、アプリは破棄状態から戻っており、状態ディクショナリを使用してアプリケーション状態を復元する必要があります。アプリケーションでは、分離ストレージからの読み込みやネットワーク リソースの読み込みなどのリソースを集中的に使用するタスクを、Activated イベント ハンドラー内で実行しないようにする必要があります。これを行うと、アプリの再開に要する時間が長くなるからです。これらの処理は、アプリケーションが読み込まれた後に、バックグラウンド スレッドで実行してください。Deactivated 中に保存した状態ディクショナリがアプリを再アクティブ化するときにメモリ内に存在するため、それらの状態ディクショナリを使用して、リソースを集中的に使用するファイル操作のオーバーヘッドを生じさせることなく状態を復元できます。

OnNavigatedTo メソッド

OnNavigatedTo(NavigationEventArgs) メソッドは、ユーザーがページに移動したときに呼び出されます。これには、アプリが最初に起動したとき、ユーザーがアプリのページ間を移動したとき、およびアプリが休止状態または破棄状態から再起動したときが含まれます。このメソッドでは、ページが新しいインスタンスであるかどうかをアプリで確認する必要があります。ページが新しいインスタンスではない場合、ページ状態を復元する必要はありません。ページが新しいインスタンスであり、そのページの状態ディクショナリにデータが存在する場合、そのデータを使用してページの UI の状態を復元する必要があります。

Closing イベント

Closing イベントは、ユーザーがアプリの最初のページを越えて後ろに移動したときに発生します。この場合、アプリは終了し、状態は保存されません。Closing イベント ハンドラーでは、インスタンス間で持続させる必要があるデータを保存できます。アプリには、どのアプリケーション イベントおよびページ移動イベントを完了させるにも 10 秒間という制限があります。この制限を超えた場合、アプリケーションは終了します。そのため、持続的な状態をアプリケーションのライフタイム全体を通じて保存しておき、Closing イベント ハンドラーで大量のファイル I/O を実行するのは避けることをお勧めします。

注意注意:

オペレーティング システムがフォアグラウンドにないアプリを終了させた場合、Closing イベントは発生しません。アプリは、Closing ではなく、Deactivated イベントの受信に依存できます。このため、Deactivated イベント ハンドラーで必須のクリーンアップと状態保守の全タスクを実行する必要があります。

アプリケーションのライフサイクル中に発生するイベントと、各イベントに対してアプリで実行する必要があるアクションを次の表にまとめます。

イベントまたはメソッド

アプリケーション アクション

Launching イベント

ごく少量のコードを実行します。分離ストレージへのアクセスなど、リソースを集中的に使用する操作は実行しないでください。

OnNavigatedFrom メソッド

後ろへの移動ではない場合は、UI 状態を State ディクショナリに保存します。

Deactivated イベント

アプリが破棄された場合は、アプリ状態を State に保存します。また、アプリケーションが終了した場合は、持続的な状態を分離ストレージに保存します。アプリが休止状態になった場合は、メモリ内にあるアプリ状態を破棄しないでください。

Activated イベント

IsApplicationInstancePreserved を確認します。true の場合は、何も行いません。false の場合は、State 内のデータを使用してアプリケーション状態を復元します。

OnNavigatedTo メソッド

ページが新しいインスタンスであるかどうかを確認します。ページが新しいインスタンスではない場合、状態は自動的にそのままにされます。それ以外の場合、State にデータがあれば、そのデータを使用して UI を復元します。

Closing イベント

持続的なアプリケーション データを分離ストレージに保存します。

注意注意:

このセクションで説明したイベントを使用すると、アプリケーションがフォアグラウンドとバックグラウンドの間で切り替えられるときに状態を保存したり復元したりすることができます。ただし、状態データの保存はデータが変更されたときに行うことをお勧めします。たとえば、Web 要求の結果は、その結果がネットワークから届いたときに、ディスクまたはアプリケーションの状態ディクショナリ (またはそれらの両方) に保存できます。Deactivated イベントが発生するのを待機してから、このデータを格納するのは好ましくありません。既に説明したように、すべてのアプリケーション ライフサイクル イベントでは、アプリケーションが任意のタスクを完了するまでに 10 秒の制限があります。

表示: