빠른 시작: 백그라운드 작업 만들기 및 등록(HTML)

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

이 항목에서는 앱에 대한 백그라운드 작업 작업자를 만들고 등록하는 방법에 대해 설명합니다.

사전 요구 사항

  • 앱에서 백그라운드 작업을 제공할 준비를 합니다.

백그라운드 작업 클래스 만들기

백그라운드 작업에서 실행되는 코드를 사용하여 별도의 메서드를 만듭니다. 이 코드는 특정 이벤트가 트리거될 때 실행됩니다. 앱에서 사용할 수 있는 트리거 형식 목록은 SystemTriggerMaintenanceTrigger를 참조하세요.

다음 단계에서는 Windows.UI.WebUI.WebUIBackgroundTaskInstance를 사용하는 백그라운드 작업 작업자를 작성하는 방법을 보여 줍니다. 시작하기 전에 Microsoft Visual Studio에서 빈 JavaScript 파일을 새로 만듭니다.

  1. 프로젝트에 새 JavaScript 파일을 만듭니다. 이 파일의 함수 및 코드는 백그라운드에서 실행됩니다.

    다음 골격 코드를 참조하면 시작하는 데 도움이 될 수 있습니다.

    
    //
    // A JavaScript background task is specified in a .js file. The name of the file is used to
    // launch the background task.
    //
    (function () {
        "use strict";
    
        //
        // This var is used to get information about the current instance of the background task.
        //
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
    
    
        //
        // This function will do the work of your background task.
        //
        function doWork() {
            var key = null,
                settings = Windows.Storage.ApplicationData.current.localSettings;
    
            // Write JavaScript code here to do work in the background.
    
    
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Succeeded";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
        doWork();
    
    })();
    
  2. 백그라운드 작업은 작업을 중지하도록 요청될 경우 이를 인식해야 합니다. 먼저 "canceled" 이벤트에 대한 이벤트 수신기를 추가하고 백그라운드 작업에 신호를 보낼 "canceled"라는 변수를 추가합니다.

    백그라운드 작업 샘플(영문)은 onCanceled 함수를 사용하여 "canceled" 이벤트를 수신 대기합니다.

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

    그런 다음 canceled가 true로 설정된 경우 작업을 중지하고 닫히도록 코드를 수정합니다.

    백그라운드 작업 샘플(영문)은 SampleBackgroundTask라는 작업을 만듭니다.

    
    //
    // A JavaScript background task is specified in a .js file. The name of the file is used to
    // launch the background task.
    //
    (function () {
        "use strict";
    
        //
        // This var is used to get information about the current instance of the background task.
        //
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
    
    
        //
        // This function will do the work of your background task.
        //
        function doWork() {
            var key = null,
                settings = Windows.Storage.ApplicationData.current.localSettings;
    
            //
            // TODO: Write your JavaScript code here to do work in the background.
            // If you write a loop or callback, remember  have it check for canceled==false.
            //
    
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Succeeded";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
        if (!canceled) {
            doWork();
        } else {
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
    })();
    
  3. 백그라운드 작업이 작업을 완료하거나 취소될 때마다 기본 제공 close() 메서드를 호출하는지 확인합니다. 백그라운드 작업이 자동으로 닫히지 않으면 백그라운드 작업의 프로세스가 계속 존재하여, 백그라운드 작업이 완료된 경우에도 메모리와 배터리 수명을 소모할 수 있습니다.

    JavaScript 백그라운드 작업이 작업을 완료하거나 취소될 때마다 close()를 호출합니다.

    
    close();
    

다음 단계에서는 기존 앱(예제: "default.js")에 코드를 추가합니다.

참고  백그라운드 작업을 등록하는 데에만 사용되는 함수를 만들 수도 있습니다. 백그라운드 작업을 등록하는 방법을 참조하세요. 이 경우 다음 세 단계를 사용하지 않고 트리거를 생성하여 작업 이름, 작업 진입점 및 조건(옵션)과 함께 등록 함수에 제공하면 됩니다.

 

백그라운드 작업 등록

  1. BackgroundTaskRegistration.allTasks 속성을 반복하여 백그라운드 작업이 이미 등록되어 있는지 확인합니다. 이 단계는 중요합니다. 앱이 기존 백그라운드 작업 등록을 확인하지 않는 경우 작업을 여러 번 등록하기 쉬우므로 성능에 문제가 발생하거나 작업이 완료되기 전에 작업의 가용 CPU 시간을 모두 사용할 수 있습니다.

    다음 예제에서는 allTasks 속성을 반복하고 작업이 이미 등록된 경우 플래그 변수를 true로 설정합니다.

    var taskRegistered = false;
    var exampleTaskName = "Example background task worker name";
    
    var background = Windows.ApplicationModel.Background;
    var iter = background.BackgroundTaskRegistration.allTasks.first();
    
    while (iter.hasCurrent) {
    
        var task = iter.current.value;
    
        if (task.name === exampleTaskName) {
    
            taskRegistered = true;
            break;
        }
    
        iter.moveNext();
    }
    
  2. 아직 등록되지 않은 경우 백그라운드 작업 파일 이름과 SystemTrigger를 전달하고 register 함수를 호출하여 백그라운드 작업을 등록합니다.

    백그라운드 작업 트리거는 백그라운드 작업이 실행되는 시간을 제어합니다. 가능한 시스템 트리거 목록은 SystemTrigger를 참조하세요.

    
    if (taskRegistered != true) {
    
        var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
    
        var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false);
    
        builder.name = exampleTaskName;
        builder.taskEntryPoint = "js\\ExampleBackgroundTask.js";
        builder.setTrigger(trigger);
    
        var task = builder.register();
    }
    
  3. 트리거 이벤트가 발생한 후 작업이 실행될 시간을 제어하는 조건을 추가할 수도 있습니다(옵션). 예를 들어 사용자가 있을 때까지 작업이 실행되지 않게 하려면 UserPresent 조건을 사용합니다. 가능한 조건 목록은 SystemConditionType을 참조하세요.

    참고  

    Windows 8.1부터 백그라운드 작업 등록 매개 변수는 등록 시 유효성이 검사됩니다. 등록 매개 변수가 하나라도 유효하지 않으면 오류가 반환됩니다. 백그라운드 작업 등록이 실패할 경우 앱에서 시나리오를 처리할 수 있어야 합니다. 예를 들어 조건문을 사용하여 등록 오류를 확인한 다음 다른 매개 변수 값을 사용하여 실패한 등록을 다시 시도해야 합니다.

     

    if (taskRegistered != true) {
    
        var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
    
        var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false);
    
        builder.name = exampleTaskName;
        builder.taskEntryPoint = "js\\ExampleBackgroundTask.js";
        builder.setTrigger(trigger);
    
        builder.addCondition(new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.userPresent));
    
        var task = builder.register();
    }
    

    참고  

    Windows Phone 스토어 앱의 경우 백그라운드 작업을 등록하기 전에 RequestAccessAsync을(를) 호출해야 합니다. Windows에서는 앱이 잠금 화면에 있어야 하는 백그라운드 작업 집합을 실행하려는 경우에만 이 호출이 필요하지만 Phone에서는 백그라운드 작업을 등록하기 전에 이 메서드를 한 번 호출해야 합니다.

    Windows Phone 앱을 계속 실행되는 올바로 해제한 후에는 업데이트가 업데이트 중인 후 앱이 시작될 때 RemoveAccess를 호출한 후 RequestAccessAsync를 호출합니다. 자세한 내용은 백그라운드 작업에 대한 지침(HTML)을 참조하세요.

백그라운드 작업 완료 처리

앱은 앱이 활성화될 때마다 "completed" 이벤트 수신기를 등록하여 백그라운드 작업의 진행률 및 완료를 확인할 수 있습니다.

  1. 앱에서 백그라운드 작업자의 완료를 인식하는 데 사용할 수 있는 함수를 씁니다.

    백그라운드 작업 샘플(영문)에서는 onCompleted 함수를 추가합니다.

    
    //
    // Handle background task completion.
    //
    "completeHandler": function (task) {
        this.onCompleted = function (args) {
            try {
                var key = task.taskId;
                var settings = Windows.Storage.ApplicationData.current.localSettings;
                var status = settings.values[key];
    
                switch (task.name) {
                    case BackgroundTaskSample.sampleBackgroundTaskName:
                        BackgroundTaskSample.sampleBackgroundTaskStatus = status;
                        SampleBackgroundTask.updateUI();
                        break;
                    case BackgroundTaskSample.sampleBackgroundTaskWithConditionName:
                        BackgroundTaskSample.sampleBackgroundTaskWithConditionStatus = status;
                        SampleBackgroundTaskWithCondition.updateUI();
                        break;
                    case BackgroundTaskSample.servicingCompleteTaskName:
                        BackgroundTaskSample.servicingCompleteTaskStatus = status;
                        ServicingComplete.updateUI();
                        break;
                    case BackgroundTaskSample.javaScriptBackgroundTaskName:
                        BackgroundTaskSample.javaScriptBackgroundTaskStatus = status;
                        JavaScriptBackgroundTask.updateUI();
                        break;
                    case BackgroundTaskSample.timeTriggerTaskName:
                        BackgroundTaskSample.timeTriggerTaskStatus = status;
                        TimeTriggerBackgroundTask.updateUI();
                        break;
                }
            } catch (ex) {
                //WinJS.log && WinJS.log(ex, "sample", "status");
            }
        };
    }
    
  2. 함수를 사용하여 "완료" 이벤트 수신기를 구독합니다.

    백그라운드 작업 샘플(영문)에서는 "완료" 이벤트에 onCompleted를 추가합니다.

    
    task.addEventListener("completed", new BackgroundTaskSample.completeHandler(task).onCompleted);
    

앱 매니페스트에서 앱이 백그라운드 작업을 사용한다고 선언

백그라운드 작업을 실제로 등록하려면 먼저 앱 매니페스트에서 각 백그라운드 작업과 사용되는 트리거를 선언해야 합니다.

  • 앱 매니페스트를 열고 Extensions 요소로 이동합니다. 앱에 사용된 각 백그라운드 작업 클래스에 대해 범주를 "windows.backgroundTasks"로 설정하여 Extension 요소를 추가합니다. 백그라운드 작업에서 사용하는 각 트리거 형식을 나열해야 합니다. 그렇지 않으면 앱이 선언되지 않은 트리거 형식이 포함된 백그라운드 작업을 등록할 수 없습니다.

    백그라운드 작업 샘플(영문)에서는 세 명의 백그라운드 작업 작업자를 등록합니다.

    
    <Extension Category="windows.backgroundTasks" StartPage="js\backgroundtask.js">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
      <BackgroundTasks>
        <Task Type="systemEvent" />
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
    

요약

이제 백그라운드 작업 클래스를 작성하는 방법, 앱 내에서 백그라운드 작업을 등록하는 방법 및 백그라운드 작업이 완료될 때 앱에서 인식하는 방법을 이해해야 합니다. 또한 OS에서 앱의 백그라운드 작업 등록을 허용하도록 응용 프로그램 매니페스트를 업데이트하는 방법을 이해해야 합니다.

참고  백그라운드 작업 샘플(영문)을 다운로드하여 백그라운드 작업을 사용하는 완벽하고 강력한 JavaScript 앱의 컨텍스트에서 이러한 코드 예제 등을 확인할 수 있습니다.

 

관련 항목

자세한 백그라운드 작업 지침 항목

백그라운드 작업으로 시스템 이벤트에 응답하는 방법

백그라운드 작업을 등록하는 방법

백그라운드 작업 실행 조건을 설정하는 방법

유지 관리 트리거를 사용하는 방법

취소된 백그라운드 작업을 처리하는 방법

백그라운드 작업 진행 및 완료를 모니터링하는 방법

타이머에 따라 백그라운드 작업을 실행하는 방법

백그라운드 작업 지침

백그라운드 작업에 대한 지침 및 검사 목록

백그라운드 작업을 디버그하는 방법

Windows 스토어 앱에서 일시 중단, 다시 시작 및 백그라운드 이벤트를 트리거하는 방법(디버깅 시)

백그라운드 작업 API 참조

Windows.ApplicationModel.Background