타이머에 따라 백그라운드 작업 실행

TimeTrigger를 사용하여 일회성 백그라운드 작업을 예약하거나 정기적 백그라운드 작업을 실행하는 방법을 알아봅니다.

이 항목에서 설명하는 시간으로 트리거되는 백그라운드 작업을 구현하는 방법의 예는 백그라운드 활성화 샘플Scenario4를 참조하세요.

이 항목에서는 정기적으로 또는 특정 시간에 실행해야 하는 백그라운드 작업이 있다고 가정합니다. 백그라운드 작업이 아직 없는 경우 BackgroundActivity.cs에 샘플 백그라운드 작업이 있습니다. In-process 백그라운드 작업 만들기 및 등록 또는 Out-of-process 백그라운드 작업 만들기 및 등록의 단계에 따라 백그라운드 작업을 하나 만들 수도 있습니다.

시간 트리거 생성하기

TimeTrigger를 생성하세요. 두 번째 매개변수인 OneShot은 백그라운드 작업을 한 번만 실행할지, 아니면 주기적으로 계속 실행할지 여부를 지정합니다. OneShot이 true로 설정된 경우, 첫 번째 매개변수(FreshnessTime)는 백그라운드 작업을 예약하기 전에 대기할 시간(분)을 지정합니다. OneShot이 false로 설정된 경우, FreshnessTime은 백그라운드 작업이 실행되는 빈도를 지정합니다.

데스크톱 또는 모바일 디바이스 제품군을 대상으로 하는 UWP(유니버설 Windows 플랫폼) 앱의 기본 제공 타이머는 15분 간격으로 백그라운드 작업을 실행합니다. (TimerTriggers를 요청한 앱의 절전 모드를 해제하기 위해 15분마다 한 번씩만 시스템의 절전 모드가 해제되도록 타이머가 15분 간격으로 실행되어 전기가 절약됩니다.)

  • FreshnessTime이 15분으로 설정되고 OneShot이 true이면 작업이 등록된 시간부터 15~30분마다 한 번씩 실행되도록 예약됩니다. 이 값이 25분으로 설정되고 OneShot이 true이면 작업이 등록된 시간부터 25~40분마다 한 번씩 실행되도록 예약됩니다.

  • FreshnessTime이 15분으로 설정되고 OneShot이 false이면 작업이 등록된 시간 이후 15분~30분 시점부터 15분마다 실행되도록 예약됩니다. n분으로 설정되고 OneShot이 false이면 작업이 등록된 후 n분 ~ n + 15분 시점부터 n분마다 실행되도록 예약됩니다.

참고 항목

FreshnessTime이 15분 미만으로 설정된 경우 백그라운드 작업을 등록하려고 하면 예외가 발생합니다.

예를 들어 다음 트리거는 백그라운드 작업을 한 시간에 한 번 실행합니다.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(선택 사항) 조건 추가

작업이 실행되는 시간을 제어하는 백그라운드 작업 조건을 만들 수 있습니다. 조건이 맞을 때까지 조건이 백그라운드 작업 실행을 막습니다. 자세한 내용은 백그라운드 작업 실행 조건 설정을 참조하세요.

이 예제에서는 작업이 트리거될 때 사용자가 활성 상태가 되면 한 번만 실행되도록 조건이 UserPresent로 설정됩니다. 가능한 조건의 목록은 SystemConditionType을 참조하세요.

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

조건 및 백그라운드 트리거 유형에 대한 자세한 내용은 백그라운드 작업을 사용하여 앱 지원을 참조하세요.

RequestAccessAsync() 호출하기

사용자가 앱에 대한 백그라운드 작업을 비활성화했을 수 있으므로 ApplicationTrigger 백그라운드 작업을 등록하기 전에 RequestAccessAsync를 호출하여 사용자가 허용하는 백그라운드 작업 수준을 결정합니다. 사용자가 백그라운드 작업에 대한 설정을 제어하는 방법은 백그라운드 작업 최적화를 참조하세요.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

백그라운드 작업 등록

백그라운드 작업 등록 함수를 호출해서 백그라운드 작업을 등록하세요. 백그라운드 작업 등록에 대한 자세한 내용과 아래 샘플 코드의 RegisterBackgroundTask() 메서드 정의를 보려면 백그라운드 작업 등록을 참조하세요.

Important

앱과 같은 프로세스에서 실행되는 백그라운드 작업의 경우 entryPoint를 설정하지 않습니다. 앱과 별도의 프로세스에서 실행되는 백그라운드 작업의 경우 entryPoint를 네임스페이스, '.' 및 백그라운드 작업 구현을 포함하는 클래스의 이름이 되도록 설정합니다.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

백그라운드 작업 등록 매개변수는 등록 시 유효성 검사를 거칩니다. 등록 매개변수 중 하나라도 유효하지 않으면 오류가 반환됩니다. 백그라운드 작업 등록이 실패하는 시나리오를 앱이 정상적으로 처리해야 합니다. 그 대신 앱이 작업 등록을 시도한 후 유효한 등록 개체를 갖는 데 의존할 경우에는 충돌이 발생할 수 있습니다.

백그라운드 작업에 대한 리소스 관리

사용자가 앱의 백그라운드 활동을 제한해야 한다고 판단했는지 여부를 확인하려면 BackgroundExecutionManager.RequestAccessAsync를 사용하세요. 배터리 사용량에 유의하고, 사용자가 원하는 작업을 완료해야 하는 경우에만 백그라운드에서 실행하세요. 사용자가 백그라운드 작업에 대한 설정을 제어하는 방법은 백그라운드 작업 최적화를 참조하세요.

  • 메모리: 앱의 메모리와 에너지 사용을 조정하는 일은 운영 체제에서 백그라운드 작업이 실행될 수 있는지 확인하는 것이 관건입니다. 메모리 관리 API를 사용하면 백그라운드 작업에서 사용 중인 메모리의 양을 확인할 수 있습니다. 백그라운드 작업이 사용하는 메모리가 많을수록 다른 앱이 포그라운드에 있을 때 OS에서 백그라운드 작업을 계속 실행하기 어렵습니다. 사용자는 궁극적으로 앱이 수행할 수 있는 모든 백그라운드 활동을 제어하고, 앱이 배터리 사용에 미치는 영향을 파악할 수 있습니다.
  • CPU 시간: 백그라운드 작업은 트리거 유형에 따라 가져오는 벽시계로 측정하는 시간으로 제한됩니다.

백그라운드 작업에 적용되는 리소스 제약 조건은 백그라운드 작업을 이용한 앱 지원을 참조하세요.

설명

Windows 10부터 사용자가 백그라운드 작업을 활용하기 위해 더 이상 잠금 화면에 앱을 추가할 필요가 없습니다.

백그라운드 작업은 RequestAccessAsync를 먼저 호출한 경우에만 TimeTrigger를 사용하여 실행됩니다.