アプリのアクティブ化を処理する方法 (HTML)

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

Windows ランタイム アプリのアクティブ化エクスペリエンスを定義する方法を説明します。

アプリが起動されると、 activated イベントが発生します。システムによって、 新しいアクティブ化コントラクトに関連するアプリ パラメーターを渡す必要がある場合は、アプリの実行中にも このイベントが発生する可能性があります。activated イベントを使うと、 アプリの以前の状態を復元し、アプリがアクティブ化される コントラクトに関連するアクティブ化パラメーターを 取得することができます。すべてのアクティブ化コントラクトの一覧とパラメーターについて詳しくは、 ActivationKind 列挙型をご覧ください。

次の手順では、activated イベントに登録する方法と、このイベントを使ってアプリの基本状態を復元したり、タイルからの既定のアクティブ化を処理したりする方法について説明します。

手順

ステップ 1: activated イベントに登録する

グローバル スコープで activated イベントに 登録します。この例では、アクティブ化ハンドラーとして activatedHandler を設定します。アクティブ化 ハンドラーを使うと、アプリの以前の ApplicationExecution の状態と アクティブ化引数を取得できます。アクティブ化の種類の一覧については、 ActivationKind 列挙型をご覧ください。


var app = WinJS.Application;

app.addEventListener("activated", activatedHandler, false);
app.start();

ステップ 2: アプリが中断後に終了された場合は、アプリケーション データを復元する

オペレーティング システムでは、アプリの中断後、さまざまな理由でアプリを終了することがあります。このようなことが起こる可能性があるのは、ユーザーが手動でアプリを閉じたとき、ユーザーがログアウトしたとき、システムのリソースが足りないときなどです。OS がアプリを終了させた後でユーザーがアプリを起動した場合、アプリは activated イベントを受け取ります。 アプリのデータを復元する必要があるか、それとも既定の状態から開始するかを決定するには、sessionState オブジェクトを使います。sessionState 変数が定義されている場合は、この変数を使ってアプリのデータを復元し、表示されるコンテンツを更新します。定義されていない場合は、既定の状態を読み込みます。

このほか、イベント引数の PreviousExecutionState プロパティを使うと、アプリが状態を復元するかどうかを決めることができます。このプロパティの ApplicationExecutionState 値が Terminated である場合には、状態を復元する必要があります。これ以外の値であれば、アプリの既定の状態を読み込む必要があります。

   アプリが既に実行されているときにアクティブ化する場合は、保存されたデータを復元しないように注意してください。

 

function activatedHandler(eventArgs) {
   if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
   {
      // Check whether my session state variables are valid.
      // If so, retrieve the application data saved in the checkpoint handler
      if (app.sessionState) 
      {
         // TODO: Populate the UI with the previously saved application data            
      } 
      else
      {
         // TODO: Populate the UI with defaults             
      }

   }
}

ステップ 3: 新しいマシンで起動された場合は既にあるセカンダリ タイルを照会する

// Get secondary tile ids for the application and list them out

Windows.UI.StartScreen.SecondaryTile.findAllAsync().then(function (tiles) {
   if (tiles) {
      tiles.forEach(function (tile) {
         // Inspect the tile and do required work 
      });
   } 
   else {
      // there are no tiles 
      }
   });
}

ステップ 4: アクティブ化引数を取得する

システムがアプリをアクティブ化するとき、アクティブ化に対する追加のコンテキストがある場合があります。

それぞれのアクティブ化コントラクトには、アプリがアクティブ化される理由について詳しい情報を提供する固有のパラメーター セットがあります。各コントラクトの eventArgs クラスは、Windows.UI.WebUI 名前空間に定義されています。次のコード スニペットは、既定のタイル起動から引数を取得する方法を示しています。

function activatedHandler(eventArgs) {
    if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
    {
        if (eventArgs.detail.arguments !== '')
        {
            // TODO: Parse the arguments string
        }
    // Initialize the WinJS controls
    eventArgs.setPromise(WinJS.UI.processAll();)

    }
}

ステップ 5: アプリの UI を設定する

最初の起動のアクティブ化を処理した場合は、アプリがアクティブ化を完了するまでスプラッシュ画面が表示されます。場合によっては、UI を適切に初期化するためにアプリで非同期作業 (ファイルからの設定の読み取りなど) が必要になることがあります。この作業はアクティブ化中に行い、UI が完成するまでスプラッシュ画面が消えないようにする必要があります。アクティブ化の完了を遅らせるには、アクティブ化の eventArgs の setPromise() メソッドを使います。前のコード スニペットでは、setPromise() を使い、processAll() の非同期呼び出しが完了するまでアクティブ化の完了を遅らせています。

Microsoft Visual Studio テンプレートを使うと、setPromise() が呼び出されます。スプラッシュ画面が消える前に完了させる必要がある非同期作業が存在する場合は、新しいページ フラグメントの "processed" イベント中にその作業を完了させます。この非同期処理から promise を返し、処理が完了するまで "processed" イベントの完了を遅らせるようにしてください。processed イベントは、アプリが特定のページ フラグメントに移動すると呼び出されます。したがって、アクティブ化に固有のコードは、アクティブ化によってトリガーされるナビゲーションでのみ実行されるようにします。このコードは、通常のナビゲーションではスキップする必要があります。

  スプラッシュ画面は、最初の UI を設定するのに必要なきわめて短い時間の処理を隠すためのものです。ネットワークの呼び出しやディスク上の大きなファイルの読み込みのような長時間にわたって実行される処理は、アクティブ化中には行わないでください。このような場合、アプリは非同期処理を完了するまでバックグラウンドで実行しながら、アクティブ化中の進行状況 UI または追加スプラッシュ画面を設定し、アクティブ化から直ちに戻る必要があります。

 

processed: function (element, options) {
            // During an initial activation this event is called before activation completes.
            // Do any initialization work that is required for the initial UI to be complete.
            // Retrieve settings from a file
            return app.local.readText(settingsFile, "default").then(function (str){
                //use the settings to update the UI
            }, function () {
                //handle the error condition
               });
           },

ready:     function (element, options) {
            // During an initial activation this event is called after activation completes.
            // Do any initialization work that is not related to getting the initial UI set up.
           }

注釈

アプリが起動した後は、DOMContentLoaded イベントが終わり、WinJS.Application.onloaded イベントが始まるまでの間に、アクティブ化されたイベントが発生します。 アプリの実行中には、アクティブ化されたイベントがいつでも発生する可能性があります。

  なんらかの理由でアプリをトップ レベルのドキュメントに移動する必要がある場合は、トップ レベルへのナビゲーションを試みる前に、まずライセンス認証を完了する必要があります。ライセンス認証前にトップ レベルへのナビゲーションを試みると、アプリはクラッシュします。こうすることで、ナビゲーション中に JavaScript のコンテキストが終了して再作成される前に、アプリやシステムが一貫性のある状態になります。

 

  

Windows Phone ストア アプリでは、アプリが現在中断中で、ユーザーがプライマリ タイルまたはアプリの一覧からアプリを再起動した場合でも、resuming イベントの後に、activated イベントが常に発生します。現在のウィンドウにコンテンツ セットが既にある場合、アプリは初期化をスキップすることがあります。LaunchActivatedEventArgs.TileId プロパティを調べると、アプリがプライマリ タイルとセカンダリ タイルのどちらから起動されたかを確認できます。また、その情報に基づいて、新しいアプリ エクスペリエンスを表示するか、アプリ エクスペリエンスを再開するかを決めることができます。

完全な例

アプリのライフサイクル イベントの処理方法を示したコード例の全体については、WinJS サンプルを使ったアプリのアクティブ化と中断に関するページWRL サンプルを使ったアプリのアクティブ化、再開、中断に関するページをご覧ください。

関連トピック

タスク

アプリを一時停止する方法

アプリを再開する方法

概念

アプリケーションのライフサイクル

辞書/リファレンス

Windows.ApplicationModel.Activation.ActivationKind

Windows.UI.WebUI.WebUILaunchActivatedEventArgs

WinJS.Application.activated