앱 내에서 백그라운드 작업 트리거

ApplicationTrigger를 사용하여 앱 내에서 백그라운드 작업을 활성화하는 방법을 알아봅니다.

애플리케이션 트리거를 만드는 방법의 예는 이 를 참조하세요.

이 항목에서는 애플리케이션에서 활성화하려는 백그라운드 작업이 이미 있다고 가정합니다. 백그라운드 작업이 아직 없는 경우 BackgroundActivity.cs에 샘플 백그라운드 작업이 있습니다. 또는 Out-of-process 백그라운드 작업 만들기 및 등록의 단계에 따라 백그라운드 작업을 하나 만듭니다.

애플리케이션 트리거를 사용하는 이유

ApplicationTrigger를 사용하여 포그라운드 앱에서 별도의 프로세스로 코드를 실행합니다. 앱에 사용자가 포그라운드 앱을 닫더라도 배경에서 수행해야 하는 작업이 있는 경우 ApplicationTrigger가 적합합니다. 백그라운드 작업이 앱이 닫힐 때 정지되어야 하거나 프로그라운드 프로세스의 상태에 연결되어야 하는 경우 확장 실행을 대신 사용해야 합니다.

애플리케이션 트리거를 만듭니다.

ApplicationTrigger를 만듭니다. 아래 조각에서 완성되면 필드에 저장할 수 있습니다. 이는 편의상 나중에 트리거 신호를 보내려고 할 때 새 인스턴스를 만들 필요가 없게 하기 위함입니다. 그러나 ApplicationTrigger 인스턴스를 사용하여 트리거 신호를 보낼 수 있습니다.

// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();

(선택 사항) 조건 추가

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

이 예에서 조건은 InternetAvailable로 설정되어 트리거되면 인터넷 액세스가 가능한 경우에만 작업이 실행됩니다. 가능한 조건의 목록은 SystemConditionType을 참조하세요.

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

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

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() 메서드 정의를 보려면 백그라운드 작업 등록을 참조하세요.

Application 트리거를 사용하여 포그라운드 프로세스의 수명을 연장하려는 경우 확장 실행을 대신 사용합니다. Application 트리거는 별도로 호스트되는 작업용 프로세스를 만들도록 설계되었습니다. 다음 코드 조각은 Out-of-process 백그라운드 트리거를 등록합니다.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example application trigger";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example application trigger";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);

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

백그라운드 작업 트리거

백그라운드 작업을 트리거하기 전에 BackgroundTaskRegistration을 사용하여 백그라운드 작업이 등록되었는지 확인합니다. 앱 시작 중에 모든 백그라운드 작업이 등록되었는지 확인하는 것이 좋습니다.

ApplicationTrigger.RequestAsync를 호출하여 백그라운드 작업을 트리거합니다. ApplicationTrigger 인스턴스라면 다 됩니다.

앱이 백그라운드 실행 상태일 때 또는 백그라운드 작업 자체에서 ApplicationTrigger.RequestAsync를 호출할 수 없습니다. 애플리케이션 상태에 대한 자세한 내용은 앱 수명 주기를 참조하세요. 사용자가 앱의 백그라운드 작업 실행을 차단하는 에너지 정책이나 개인정보 보호정책을 설정한 경우 DisabledByPolicy를 반환할 수 있습니다. 또한 한 번에 한 AppTrigger만 실행할 수 있습니다. AppTrigger가 실행 중인 동안 다른 AppTrigger를 실행하려고 하면 CurrentlyRunning이 반환됩니다.

var result = await _AppTrigger.RequestAsync();

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

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

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

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

설명

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

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