Metroスタイルアプリケーションではバックグランドに切り替わったアプリケーションは、実行を一時的に中断します(suspend)。システムリソースが不足すると、Windows OSは一時的に実行を中断しているアプリケーションを強制的に終了します。従って失われては困るアプリケーションのデータがある場合には、一時的に実行が中断したときに、データを退避(保存)する必要があります。

実行中断時のデータの保存と復元

 ここでは、WinWebApp1のページにテキスト入力領域を追加し、ここに入力したデータを保存する実装を追加しましょう。default.htmlをコードエディターで開いたら、body開始タグのすぐ下にtextarea要素ブロックを追加します(リスト6の(1))。次に、default.jsをコードエディターで開き、ファイルの後半にあるstart関数呼び出し(リスト7の(2))の前後に、(1)と(3)のコードを追加します。

 リスト7の(1-1)と(1-2)はそれぞれWindows RuntimeのAPIを直接使用して、起動時のactivatedイベントと、中断直前のsuspendingイベントのイベントハンドラを指定しています。(3-4)のsuspendingイベントハンドラ内では、textarea要素のデータをローカルに保存し(3-5)、(3-1)のactivatedイベントハンドラでは保存したデータを読み込んでいます(3-3)。これらの処理では、アプリケーションごとのローカルな情報を保存するための内部的なストレージであるWinJS.Application.localオブジェクトを使用しています。

 なお、データを復元する必要があるのは、中断したプログラムがWindows OSによって強制的に終了した場合です。本来は、ユーザーが手動で終わらせたときは、次回起動時に復元する必要はありません。ただし、このサンプルでは単純化するため、起動時には無条件で前の状態に復元しています。実際のアプリケーションでは、(3-2)のコメントブロックに記述されたifブロックを使用し、Windows OSによって強制終了されたのかどうかを判断した上で、復元を行います。

 確認してみましょう。プログラムをデバッガーから起動すると、Windows OSが自動的に実行を中断してくれないので、ビルドして配置した後、スタートスクリーンから起動することにします。

図29●左上端のテキスト入力領域に適当な文字列を入力する
図29●左上端のテキスト入力領域に適当な文字列を入力する

 デスクトップ環境のタスクバーの左端のスタートボタンをクリックして、スタートスクリーンに切り替えます。スタートスクリーン上のタイル「WinWebApp1」をタッチしてアプリケーションを起動したら、図29のように左上部のテキスト領域に適当な文字列を入力します。

 画面左端を指で右方向へなぞるなどしてアプリケーションを切り替えたら、タスクマネージャーを起動して、「WinWebApp1」の横に「Suspended」と表示されるのを待ちます。「Suspended」の状態になったら、その直前にデータを退避しているはずなので、「WinWebApp1」を右クリックして、ショートカットメニューから[End Task]を選択して「WinWebApp1」を終了します。再び、スタートスクリーンを表示させて、スタートスクリーンの「WinWebApp1」をタッチして実行させると、画面が図29のように表示され、テキスト領域の文字列が復元されていることがわかります。

矢嶋 聡(やじま さとし)
矢嶋 聡(やじま さとし) エディフィストラーニング勤務。ランニング練習で、Windows Mobile 6用のC#版自作ストップウォッチを使っています。シンプルですが、ほしい情報がすぐに見えて重宝しています。写真はゴールドコーストマラソン2010の35km地点。