アプリを中断する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
システムが Windows ランタイム アプリを中断するときに、重要なアプリケーション データを保存する方法を説明します。 アプリがシステムによって中断されると、その後警告なく終了される場合があります。アプリが再起動したときに状態を復元できるよう、アプリでユーザーの現在の状態を保存することが重要です。ユーザーには、アプリがバックグラウンドで中断されたり終了したりしたことはわかりません。
次の手順に、checkpoint イベントに登録する方法と、このイベントを使ってアプリの基本状態を保存する方法を示します。
手順
ステップ 1: checkpoint イベントに登録する
グローバル スコープで checkpoint イベントに登録します。このイベントは、システムによってアプリが中断されていることを示します。中断されたアプリは、システム リソースを解放するためにシステムによって終了される場合があります。このため、checkpoint イベント時にアプリのデータを保存しておくことが重要になります。
var app = WinJS.Application;
app.addEventListener("checkpoint", checkpointHandler);
ステップ 2: 中断の前にアプリケーション データを保存する
アプリでは、checkpoint イベントを処理する時点で、checkpoint イベントのハンドラー関数で重要なアプリケーション データを保存できます。アプリで sessionState オブジェクトを使って、単純なアプリケーション データを同期的に保存できます。sessionState オブジェクトにデータが保持され、終了後にアクティブ化するときにそのデータにアクセスすることができます。
function checkpointHandler(eventArgs)
{
var stateObject = new Object();
// TODO: Populate the state object with app data
// Save the state object to the session object
app.sessionState.stateObject = stateObject;
}
ステップ 3: 排他リソースとファイル ハンドルを解放する
アプリでは、checkpoint イベントを処理する時点で、排他リソースとファイル ハンドルを解放することもできます。排他リソースには、カメラ、I/O デバイス、外部デバイス、ネットワーク リソースなどがあります。排他リソースとファイル ハンドルを明示的に解放すると、自分のアプリが使っていないときに他のアプリが排他リソースとファイル ハンドルにアクセスできるようになります。アプリが終了後にアクティブ化されるときに、排他リソースとファイル ハンドルを開く必要があります。
注釈
ユーザーが別のアプリまたはデスクトップに切り替えると、システムはアプリを中断します。ユーザーが元のアプリに戻すと、システムはアプリを再開します。システムがアプリを再開した時点で、変数とデータ構造の内容は、システムがアプリを一時停止する前の状態と同じです。システムはアプリを厳密に一時停止前の状態に復元するので、ユーザーからはアプリがバックグラウンドで実行していたように見えます。
システムはアプリが中断されている間、アプリとそのデータをメモリに保持するよう試みます。しかし、OS では、アプリの中断後、さまざまな理由でアプリを終了することがあります。このようなことが起こる可能性があるのは、ユーザーが手動でアプリを閉じたとき、ユーザーがログアウトしたとき、システムのリソースが足りないときなどです。終了されたアプリにユーザーが戻るときに、アプリは activated イベントを受け取って、sessionState オブジェクトが定義されているかどうかを確かめる必要があります。このオブジェクトが定義されていなければ、そのデータを読み込む必要があります。
システムはアプリが終了されるときにアプリに通知を送らないので、アプリは中断されたときにアプリケーション データを保存したうえで排他リソースとファイル ハンドルを解放し、アプリが中断された状態から再開するときや、終了後にアクティブ化されるときに、それらを復元する必要があります。
注 アプリの中断が進められているときに非同期作業が必要になった場合には、その作業が完了するまで中断の完了を遅らせる必要があります。そのプロミスが完了するまで中断の完了を遅らせるには、checkpoint イベント引数の "詳細" プロパティに対して setPromise メソッドを使います。
注 Windows 8.1 と Windows Phone でシステムの応答性を向上させるために、アプリには中断後にリソースへの優先度の低いアクセスが与えられます。この新しい優先度をサポートするために、中断操作のタイムアウトが延長され、アプリには通常の優先度と同程度のタイムアウト (Windows では 5 秒、Windows Phone では 1 ~ 10 秒) が与えられます。 このタイムアウトの時間枠を延長したり、変更したりすることはできません。
Microsoft Visual Studio によるデバッグに関する注意事項: Visual Studio は、Visual Studio デバッガーにアタッチされているアプリを Windows が中断するのを防ぎます。これは、アプリが実行されている間、ユーザーが Visual Studio デバッグの UI を確認できるようにするためです。アプリのデバッグ中は、Visual Studio を使ってそのアプリに中断イベントを送信できます。 [デバッグの場所] ツール バーが表示されていることを確認し、[中断] アイコンをクリックします。
完全な例
アプリのライフサイクル イベントの処理方法を示したコード例の全体については、WinJS サンプルを使ったアプリのアクティブ化と中断に関するページと WRL サンプルを使ったアプリのアクティブ化、再開、中断に関するページをご覧ください。
関連トピック
タスク
概念
ガイドライン
辞書/リファレンス