Windows ストア アプリと Web コンテンツの違い (3/3)


HTML + JavaScript を使用した WSindows ストア アプリの開発方法について書いています。

念のために補足しておきますと 「Windows ストア アプリ」 とは Windows 8 の、かつて Metro と呼ばれた “新しい UI” (※) 上で動作するアプリケーションのことを言います。

(※) この “新しい UI” を英語のまま “Modern UI” なんてぇ書いてる記事が散見されますが我々はそんなふうに呼んでませんので。(たまに社員でも間違えている人がいますが)

 

前々回から 3 回に分けて HTML + JavaScript で作成する Windows ストア アプリと Web コンテンツはなにが違うのか? について書いています。

このような切り口にしたのは、Windows ストア アプリと Web コンテンツの違いを理解することで、それまで培った Web 制作の技術/過去に作成した Web コンテンツを、Windows ストア アプリに転用するということがスムーズに行えるようになるからです。

以下、前回までの投稿記事となりますので、まだお読みになっていない方はこれからの記事を読む前にぜひご覧ください。

今回は、いままでのデスクトップ アプリケーションではあまり意識することのなかった、アプリケーションのライフタイムについて紹介します。

 

Windows ストア アプリのライフタイム

”アプリケーションライフタイム” とは文字通り “アプリケーションの寿命” であり、アプリケーションの稼働時間、つまりはアプリケーションが起動してから終了されるまでの時間を指しています。

従来のデスクトップ アプリケーションでは、このライフタイムはユーザーが管理しており、ユーザーがアプリケーションを起動し、終了するまでがライフタイムでした。

Windows ストア アプリでは、ライフタイムの管理は基本的にユーザーは行いません。

 

OS がライフタイムを 管理

Windows ストア アプリのライフタイムの管理は OS が行います。

具体的には、アプリの起動こそユーザーが行いますが、アプリの終了は OS が行います。

この振る舞いは Windows ストア アプリの稼働状態についての仕様に関係しています。

 

Windows ストア アプリ プロセスの状態遷移

Windows ストア アプリが稼働しているのは、アプリが画面に表示されている (アクティブになっている) 間だけです。

バッググラウンドに送られると、アプリはサスペンド (中断) 状態に遷移します。

image(Windows ストア アプリはバッググラウンドでサスペンド状態となる)

 

この状況はタスクマネージャーでも確認することができます。

image(タスクマネージャーでの Windows ストアの状態)

 

この状態のアプリは、メモリにサスペンド直前までの情報を保し続けますが、CPU、メモリ、ディスク、ネットワーク等のリソースは使用せず、完全に停止した状態となります。

アプリがユーザーによってアクティブにされると、アプリは再び稼働を開始します。

image(Widows ストア アプリはフォアグラウンドで稼働を再開する)

 

しかしサスペンド状態のアプリの数が増えていき、やがて OS のリソースを逼迫する事態となると、OS がサスペンド状態になっているアプリを終了させます。

image(Widows ストア アプリはリソースが逼迫してくると終了させられる)

 

アプリは終了され、使用していたメモリは解放されてしまうので、アプリが保持していたデータは消えてしまいます。

たとえば、ユーザーがなにがしかのデータを入力中であっても、関係なく終了されてしまうので、そういったデータを扱うアプリでは、失っては困るデータを適切なタイミングで保存しておく必要があります。

 

データを保存するタイミング

アプリケーションがサスペンドされる際に oncheckpoint イベントが発生するので、そのタイミングでアプリケーションの扱っているデータを保存します。

このイベントハンドラは、Visual Studio 2012 が提供する JavaScript + HTML アプリのプロジェクト テンプレートにはすべて定義されており、ハンドラの記述箇所は /js/default.js 内のファイルの最後の方、app.start() メソッドの手前で定義されています。

image(グリッド アプリのプロジェクト テンプレートに記述されている oncheckpoint イベント)

 

このイベントハンドラ内にデータの保存に必要な処理を記述します。

ちなみに Visual Studio 2012 が提供する グリッド アプリケーション テンプレートでは、その時のページ遷移位置をセッション変数 “history” (※) に保存しています。

(※) セッション変数名は任意の名前が使用できます。

 

image(セッション変数に現在のページ位置を保存)

保存したデータを読み戻すタイミング

Visual Studio 2012 が提供する全ての Windows ストア アプリケーション (HTML + JavaScript ) テンプレートには /js フォルダに default.js という JavaScript ファイルが提供されアプリの初期化や基本的な機能を提供しています。

この default.js 内にはアプリの起動の際に、アプリが新規で起動されたのか、それとも OS から終了させられた後の機能なのか判断している箇所があり、必要であればその判断文を利用することができます。

 

image(default.js にある OS によって終了されられたか否かの判断)

 

ちなみに前述の oncheckpoint イベント ハンドラでセッション変数に保存されたページ位置は、アプリが OS によって終了した/しないにかかわらず、以下のようにデータを読みだしています。

 

image(セッション変数にページ位置情報があれば読みだす)

セッション変数について

「セッション変数」 というと、アプリのインスタンスとともに消失してしまいそうな印象を受けますが、Windows ストアアプリの 「セッション変数」 はその限りではありません。

WinJS が提供するセッション オブジェクト WinJS.Application.sessionState は、セッション変数に設定された情報をアプリのサスペンド時にシリアル化してディスクに保存します。

そのため、アプリが OS により終了させられていても、再起動時にそのデータを取り出して利用することができます。

逆に、ユーザーが [alt] + [F4] キーなどで意図的にアプリを終了した場合、あるいはエラーなどにより予期しない終了をした場合にはセッション変数からその情報を取り出すことはできません。

セッション変数を有効に使用すると、アプリの中断後の起動であっても、中断前の作業をシームレスに継続して行うことができますので、特徴を理解し、ぜひご利用ください。

 

まとめ

今回は Windows ストア アプリのライフタイムと、OS からアプリが終了される際に、アプリのデータをどのタイミングでどう保存するかについて紹介しました。

より詳細な情報については、以下のドキュメントをご参照ください。

 

パート 2: アプリのライフサイクルと状態の管理 (JavaScript と HTML を使った Windows ストア アプリ)
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh986966.aspx

 

次回は Windows ストア アプリの開発に使用するツールを紹介します。

Real Time Analytics

Clicky

Comments (0)

Skip to main content