Windows Phone の実行モデルの概要

2012/02/09

Windows Phone の実行モデルは、Windows Phone 上で実行されるアプリケーションの起動から終了までのライフサイクルを管理します。

この実行モデルは、常に応答性がよくすばやいエクスペリエンスをエンド ユーザーに提供できるように設計されています。これを達成するために、Windows Phone では、一度に 1 つのアプリケーションしかフォアグラウンドで実行できません。フォアグラウンドでなくなったアプリケーションは、オペレーティング システムによって休止状態にされます。フォアグラウンド アプリケーションに使用できるデバイス メモリが良好なユーザー エクスペリエンスを提供するために不十分になった場合は、休止状態のアプリケーションが、使用されてから最も時間が経過しているアプリケーションから順にオペレーティング システムによって終了されていきます。アプリケーションは非アクティブ化されたり再アクティブ化されたりするため、その状態を管理するためのプログラミング フレームワークが用意されています。これにより、アプリケーションがいったん終了してから再アクティブ化された場合でも、ユーザーには単一のインスタンスが維持されているように見えるようにすることができます。

実行モデルは、アプリケーション間での一貫したナビゲーション エクスペリエンスも提供します。Windows Phone では、ユーザーは、インストールされているアプリケーションのリストから、または [スタート] 上のタイルからアプリケーションを起動することにより、もしくはアプリケーションに関連付けられているトースト通知をタップするなどのその他の手段で、次に進むことができます。また、ハードウェアの [戻る] ボタンを使用することにより、実行中のアプリケーションのページ間で、またはこれまでに実行したアプリケーションのスタック内を遡って、前のページに戻ることができます。Windows Phone 7.5 で、ハードウェアの [戻る] ボタンを押し続けることにより、以前に実行したアプリケーションに切り替える機能が追加されました。

このトピックでは、Windows Phone アプリケーションのライフサイクルについて詳しく説明し、応答性のよいアプリケーションを開発して一貫したナビゲーション エクスペリエンスを提供するために必要な手順の概要を説明します。概要の後に続くトピックでは、サンプル コードを示しながら具体的な操作手順を示します。

オペレーティング システムはすべてのアプリケーションの実行を同じ方法で管理しますが、XNA ゲームでのアプリケーション割り込みの扱いには考慮すべき特記事項がいくつかあります。XNA ベースのアプリケーションを作成している場合は、このセクションに目を通し、さらに「Windows Phone 7 ゲームの廃棄」も参照してください。

この概要の以降の部分を読むには、以下の用語と概念を理解しておく必要があります。

アプリケーションの状態

アプリケーション内で複数のページにより使用されるデータ。例として、Web サービスから取得する構造化データが挙げられます。このデータをページごとに異なる形で表示することはかまいませんが、このデータは、まとまってアプリケーションに属しているものと考えてください。アプリケーションのすべての状態データはアプリケーションの終了時にのみ保存すべきだという一般的な誤解がありますが、この種類のデータは、多くの場合、ユーザーがページから移動するときに保存する方が効果的です。これによりアプリケーションのシャットダウン中に完了する必要がある状態管理の処理量が減少します。

ページの状態

アプリケーションの 1 つのページの現在の表示状態。ユーザーがデータを入力するためのコントロールが含まれているページがある場合、ユーザーは、いったんアプリケーションから離れた後に戻ってきたとき、フォーム内のすべてのコントロールにアプリケーションを離れたときと同じ値が入っていることを期待するものです。ページの状態を管理するアプリケーションは、読み込まれたときにユーザーが一貫したアプリケーション エクスペリエンスを得られるようにページ上のコントロールの値を設定する場合があります。ユーザーがアプリケーションの新しいインスタンスを起動したときには、ページ UI の状態が、新しいインスタンスであることを反映し、アプリケーションの以前のインスタンスから UI の状態を読み込まないようにする必要があります。

アプリケーション イベント

アプリケーションの状態管理に使用されるプライマリ イベントには、LaunchingDeactivatedActivatedClosing の 4 つがあります。これらのイベントのハンドラーは、Windows Phone アプリケーションの Visual Studio プロジェクト テンプレートの一部である Application オブジェクトに含まれています。アプリケーションの状態を管理するには、これらのイベント ハンドラーにコードを記述します。

重要な注重要な注:
すべてのアプリケーション イベントに 10 秒間という制限時間があり、アプリケーションはイベント ハンドラー内のタスクを時間内に完了する必要があります。アプリケーションがこの制限時間を超えた場合は、直ちに終了されます。このため、アプリケーション イベントのハンドラー内では分離ストレージのデータの読み取りや書き込みのようなリソースを集中的に使用するタスクの実行は避ける必要があります。このようなタスクは、可能な限り、アプリケーションの実行中にバックグラウンド スレッドで実行するようにします。アプリケーションのライフタイム全体を通じて、アプリケーション データを変更時に保存するようにすると、アプリケーション イベント中に実行する必要がある状態管理の処理量が減少します。

ページ イベント

すべての Windows Phone ページが継承する PhoneApplicationPage オブジェクトは、OnNavigatedTo(NavigationEventArgs)OnNavigatedFrom(NavigationEventArgs) の 2 つのメソッドを公開します。アプリケーションは、これらをオーバーライドしてページの状態を管理できます。

廃棄

アプリケーションを終了し、アプリケーションの状態やアプリケーション内の個々のページの状態に関するデータを保存するプロセス。保存されるデータには、現在表示されているアプリケーション ページと、アプリケーション内でこれまで表示されたページのバック スタックが含まれます。ユーザーが廃棄状態のアプリケーションに戻ると、アプリケーションが再作成され、現在のページとページ履歴が自動的に復元されます。

State ディクショナリ

キーと値のペアを格納できる Dictionary オブジェクトが、各 Windows Phone アプリケーションとアプリケーション ページに用意されます。これらのディクショナリは、アプリケーションが廃棄されても維持されます。アプリケーションが廃棄された後にアクティブ化されると、これらのディクショナリを使用してアプリケーションの状態が復元されます。これらのディクショナリ内のデータはすべてシリアル化されていなければなりません。

次のイメージに、Windows Phone アプリケーションのライフサイクルを示します。この図では、丸がアプリケーションの状態を表しています。三角は、アプリケーションがその状態を管理する場所となる、アプリケーション レベルまたはページ レベルのイベントを示します。

Windows Phone 7.5 の実行モデル図

このセクションでは、Windows Phone アプリケーションのアプリケーション ライフサイクルのすべての要素について説明し、各段階でアプリケーションが取るべきアクションを取り上げます。このセクションでは、オペレーティング システムとユーザーが何を行うとアプリケーションの状態のさまざまな変化がトリガーされるのかに関する背景情報を提供します。イベントとアプリケーションが実行すべきアクションの簡単なチェックリストについては、「実行モデルのイベントとアプリケーション アクションの概要」を参照してください。

Launching イベント

インストールされているアプリケーションのリストから、または [スタート] のタイルから、あるいはアプリケーションに関連付けられているトースト通知をタップする、Photos Extras のメニューからアプリケーションを選択するなどのその他の手段で、ユーザーによって新しいアプリケーション インスタンスが起動されると、Launching イベントが発生します。このようにして起動されたアプリケーションは、ユーザーに対して、以前のインスタンスの実行が継続されているのではなく新しいインスタンスであるように表示される必要があります。アプリケーションがすばやく読み込まれるようにするために、このイベントのハンドラーに記述するコードは可能な限り少なくしてください。特に、ファイル操作やネットワーク操作のようなリソースを集中的に使用するような処理は避けるようにします。ユーザー エクスペリエンスをベストなものにするために、このような処理はアプリケーションが読み込まれた後に、バックグラウンド スレッド上で実行してください。

実行

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

OnNavigatedFrom メソッド

OnNavigatedFrom(NavigationEventArgs) メソッドは、ユーザーがページ移動してアプリケーションのページから離れたときに必ず呼び出されるメソッドです。これは、アプリケーション内で通常のページ間移動を行った際に発生します。また、アプリケーションが非アクティブ化されたときにも呼び出されます。これについては、次のセクションで説明します。このメソッドが呼び出されたときには、アプリケーションは、必ずページの状態を保存して、ユーザーがそのページに戻ってきたときに復元できるようにしておく必要があります。ただし、前のページに戻る移動は例外となります。その移動が前のページに戻る移動かどうかは、NavigationMode プロパティを使用して判断できます。前のページに戻る移動だった場合は、次回、そのページに移動したときにはページが再作成されるため、状態を保存する必要はありません。

場合によっては、状態を OnNavigatingFrom(NavigatingCancelEventArgs) メソッドにも保存する必要があります。特に、MediaElement コントロールの状態を保存する場合は、この操作を行う必要があります。

Deactivated イベント

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

Deactivated イベントのハンドラーでは、アプリケーションの状態をすべて後から復元できるように保存しておく必要があります。Windows Phone アプリケーションには、アプリケーションの状態を保存するために使用できるディクショナリである State オブジェクトが用意されています。アプリケーションが廃棄されてから再アクティブ化されると、Deactivated で保存したデータがこの State ディクショナリに格納されます。このデータはメモリ内にあるため、これを使って、リソースを集中的に使用するファイル操作を行うことなく状態を復元できます。

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

休止状態

ユーザーが次に進んでアプリケーションから離れると、Deactivated イベントが発生した後、オペレーティング システムはアプリケーションを休止状態にしようとします。この状態では、アプリケーションのすべてのスレッドが停止し、処理は一切行われなくなりますが、アプリケーションはそのままメモリ内に残されます。アプリケーションがこの状態から再アクティブ化された場合は、すべての状態が保持されているため、アプリケーションはどの状態も一切作成し直す必要がありません。

アプリケーションが休止状態になった後に新しいアプリケーションが起動され、これらのアプリケーションに必要なメモリ量が良好なユーザー エクスペリエンスを提供できるよりも多くなった場合は、オペレーティング システムが、メモリを解放するために休止状態のアプリケーションを廃棄し始めます。

廃棄状態

廃棄状態のアプリケーションは、既に終了していますが、そのナビゲーション状態に関する情報と Deactivated の中でアプリケーションによってデータが格納された State ディクショナリは保持されています。デバイスは、一度に最大 5 つまでのアプリケーションの廃棄情報を維持します。アプリケーションが廃棄された後、ユーザーがそのアプリケーションに戻ってくると、アプリケーションが再び起動されて、保持されていたデータを使用して状態が復元されます。ユーザーが戻ってこなければ、アプリケーションはそのまま終了します。

Activated イベント

Activated イベントは、ユーザーが休止状態または廃棄状態のアプリケーションに戻ってきたときに呼び出されます。アプリケーションは、イベントの引数である IsApplicationInstancePreserved プロパティをチェックして、アプリケーションが休止状態から復帰したのか、廃棄状態から復帰したのかを調べる必要があります。IsApplicationInstancePreserved が true の場合は、アプリケーションは休止状態だったため、状態はオペレーティング システムによって自動的に保持されています。逆に false だった場合は、アプリケーションは廃棄状態になっており、State ディクショナリを使用してアプリケーションの状態を復元する必要があります。アプリケーションは、Activated イベント ハンドラー内では、分離ストレージやネットワーク リソースからの読み込みのようなリソースを集中的に使用するタスクは実行すべきではありません。これを行うと、アプリケーションの再開に要する時間が長くなってしまいます。このような処理は、アプリケーションの読み込みが完了した後に、バックグラウンド スレッド上で実行してください。

OnNavigatedTo メソッド

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

Closing イベント

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

次の表は、アプリケーションのライフサイクル内で発生するイベントと、各イベントに対してアプリケーションが取るべきアクションをまとめたものです。

イベントまたはメソッド

アプリケーションが取るアクション

Launching イベント

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

OnNavigatedFrom メソッド

前に戻るナビゲーションでない場合は、UI の状態を State ディクショナリに保存します。

Deactivated イベント

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

Activated イベント

IsApplicationInstancePreserved をチェックします。true であれば、何も行いません。false の場合は、State 内のデータを使用して、アプリケーションの状態を復元します。

OnNavigatedTo メソッド

ページが新しいインスタンスかどうかをチェックします。新しいインスタンスでない場合は、自動的にそのままにされます。新しいインスタンスの場合は、State 内にデータがあれば、それを使用して UI を復元します。

Closing イベント

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

注意点注意:

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

表示: