取り消されたバックグラウンド タスクを処理する方法 (HTML)

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

取り消し要求を認識し、作業を停止して、バックグラウンド タスク インスタンスと固定ストレージを使っているアプリの取り消しを報告するバックグラウンド タスクの作成方法について説明します。

  Windows Phone ストア アプリでは、デバイスのメモリが少なくなった場合、警告や OnCanceled イベントの発生なしにバックグラウンド タスクが終了することがあります。こうすることで、フォアグラウンドのアプリのユーザー エクスペリエンスが保証されます。バックグラウンド タスクは、このシナリオを処理できるように設計する必要があります。

理解しておく必要があること

テクノロジ

必要条件

手順

ステップ 1: イベント ハンドラーにより、取り消し要求を認識します。

取り消しイベントを処理するメソッドを作ります。

  1. 次のフットプリントを持つ OnCanceled というメソッドを作ります。このメソッドは、バックグラウンド タスクに対して取り消し要求が出されると、必ず Windows ランタイムによって呼び出されるエントリ ポイントです。

    OnCanceled 関数には、次のフットプリントがあることが条件付けられます。

    
    function onCanceled(cancelSender, cancelReason)
    {
        // TODO: Add code to notify the background task that it is cancelled.
    }
    
  2. バックグラウンド タスクに cancel という変数を追加します。これは、いつ取り消し要求を受け取ったかを示すために使います。

    たとえば、このコード行を、その他の変数定義と共に、IBackgroundTask クラスの最上段に記述します。

    var cancel = false;
    
  3. 手順 1. で作った OnCanceled メソッドで、canceltrue に設定します。

    完全なバックグラウンド タスクのサンプル、OnCanceled メソッドでは、canceltrue に設定されます。

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. バックグラウンド タスクで処理を開始する前に、"canceled" イベント リスナーに OnCanceled メソッドを登録します。

    たとえば、次のコード行を使います。

    
    backgroundTaskInstance.addEventListener("canceled", onCanceled);
    

ステップ 2: 取り消しを処理して終了します。

Run メソッドは cancel 変数を監視する必要があります。したがって、この変数が true に設定された場合は、Run メソッドを終了することができます。

  1. cancel が true に設定された場合は処理を停止するように、バックグラウンド タスク クラスのコードを変更します。

    バックグラウンド タスクのサンプルでは、バックグラウンド タスクが取り消されたときに、期間タイマーのコールバックが停止するかどうかの確認を行います。

    
    if (!cancel) {
        // Do work.
    }
    else
    {
        // Cancel.
    }
    
  2. 処理が停止したら、バックグラウンド タスク インスタンスの succeeded プロパティを false に設定してクリーンアップし、タスクの取り消しを記録します。close() を呼び出して関数を終了します。

    バックグラウンド タスクのサンプルでは、LocalSettings の状態が記録されます。

    
    if ((_cancelRequested == false) && (_progress < 100))
    {
        // See the background task sample for this code.
    }
    else
    {
        //
        // If the cancellation handler indicated that the task was canceled, stop the background task.
        //
        console.log("Background " + backgroundTaskInstance.task.name + " Canceled");
        backgroundTaskInstance.succeeded = false;
    
        key = backgroundTaskInstance.task.taskId.toString();
        settings.values[key] = "Canceled";
    
        close();
    }
    

注釈

バックグラウンド タスクのサンプルをダウンロードして、メソッドのコンテキストに従ってコード例を確認できます。

上記のサンプル コードでは、説明の便宜上、バックグラウンド タスクのサンプルのバックグラウンド タスク (およびコールバック タイマー) の一部しか示していません。

メソッド例を実行します。

バックグラウンド タスクのサンプルのコンテキストがわかるように、以下に完全な JavaScript バックグラウンド タスクを示します。

//
// A JavaScript background task runs a specified JavaScript file.
//
(function () {
    "use strict";

    //
    // The background task instance's activation parameters are available via Windows.UI.WebUI.WebUIBackgroundTaskInstance.current
    //
    var cancel = false,
        progress = 0,
        backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;

    console.log("Background " + backgroundTaskInstance.task.name + " Starting...");

    //
    // Associate a cancellation handler with the background task.
    //
    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    backgroundTaskInstance.addEventListener("canceled", onCanceled);

    //
    // This function is set to run every 1000 milliseconds ten times and perform background task activity.
    //
    function onTimer() {
        var key = null,
            settings = Windows.Storage.ApplicationData.current.localSettings;

        if (!cancel) {
            if (progress < 100) {
                //
                // Simulate work being done.
                //
                setTimeout(onTimer, 1000);

                //
                // Indicate progress to the foreground application.
                //
                backgroundTaskInstance.progress = progress;
                progress += 10;
            } else {
                //
                // Use the succeeded property to indicate that this background task completed successfully.
                //
                backgroundTaskInstance.succeeded = true;
                backgroundTaskInstance.progress = progress;
                console.log("Background " + backgroundTaskInstance.task.name + " Completed");

                //
                // Write to localSettings to indicate that this background task completed.
                //
                key = backgroundTaskInstance.task.name;
                settings.values[key] = "Completed";

                //
                // A JavaScript background task must call close when it is done.
                //
                close();
            }
        } else {
            //
            // If the cancellation handler indicated that the task was canceled, stop the background task.
            //
            console.log("Background " + backgroundTaskInstance.task.name + " Canceled");
            backgroundTaskInstance.succeeded = false;

            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";

            close();
        }
    }

    //
    // Start the timer function to simulate background task work.
    //
    setTimeout(onTimer, 1000);
})();

関連トピック

クイック スタート: バックグラウンド タスクの作成と登録

バックグラウンド タスクを登録する方法

バックグラウンド タスクをデバッグする方法

バックグラウンド タスクによるアプリのサポート

保留中のバックグラウンド タスクのリストを取得する方法

バックグラウンド タスクの進捗状況と完了を監視する方法

アプリケーション マニフェストでバックグラウンド タスクを宣言する方法

バックグラウンド タスクのガイドラインとチェック リスト