이 문서에서는 앱이 포그라운드에서 백그라운드로 이동할 때 미디어가 계속 재생되도록 앱을 구성하는 방법을 보여 줍니다. 즉, 사용자가 앱을 최소화하거나, 홈 화면으로 돌아가거나, 다른 방법으로 앱에서 멀리 이동한 후에도 앱에서 오디오를 계속 재생할 수 있습니다.
백그라운드 오디오 재생 시나리오는 다음과 같습니다.
장기 실행 재생 목록: 사용자는 잠시 포그라운드 앱을 표시하여 재생 목록을 선택하고 시작하며, 그 후에는 재생 목록이 백그라운드에서 계속 재생되기를 기대합니다.
작업 전환기 사용: 사용자가 잠시 포그라운드 앱을 표시하여 오디오 재생을 시작한 다음, 작업 전환기를 사용하여 다른 열린 앱으로 전환합니다. 사용자는 오디오가 백그라운드에서 계속 재생되도록 기대합니다.
이 문서에 설명된 백그라운드 오디오 구현을 통해 모바일, 데스크톱 및 Xbox를 비롯한 모든 Windows 장치에서 앱을 범용으로 실행할 수 있습니다.
비고
이 문서의 코드는 UWP 백그라운드 오디오 샘플에서 변경되었습니다.
한 프로세스 모델에 대한 설명
Windows 10 버전 1607에서는 백그라운드 오디오를 사용하도록 설정하는 프로세스를 크게 간소화하는 새로운 단일 프로세스 모델이 도입되었습니다. 이전에는 앱이 포그라운드 앱 외에도 백그라운드 프로세스를 관리한 다음 두 프로세스 간에 상태 변경 내용을 수동으로 전달해야 했습니다. 새 모델에서는 단순히 백그라운드 오디오 기능을 앱 매니페스트에 추가하면 앱이 백그라운드로 이동할 때 자동으로 오디오 재생을 계속합니다. 두 개의 새 애플리케이션 수명 주기 이벤트인 EnteredBackground 및 LeavingBackground 는 앱이 백그라운드로 들어가고 나갈 때를 알려줍니다. 앱이 백그라운드에서 전환으로 이동하면 시스템에서 적용하는 메모리 제약 조건이 변경될 수 있으므로 이러한 이벤트를 사용하여 현재 메모리 사용량을 확인하고 리소스를 확보하여 한도 이하로 유지할 수 있습니다.
복잡한 프로세스 간 통신 및 상태 관리를 제거함으로써 새 모델을 사용하면 코드가 크게 감소하여 백그라운드 오디오를 훨씬 더 빠르게 구현할 수 있습니다. 그러나 2 프로세스 모델은 이전 버전과의 호환성을 위해 현재 릴리스에서 계속 지원됩니다. 자세한 내용은 레거시 배경 오디오 모델을 참조하세요.
배경 오디오에 대한 요구 사항
앱이 백그라운드에 있는 동안 오디오 재생에 대한 다음 요구 사항을 충족해야 합니다.
- 이 문서의 뒷부분에서 설명한 대로 백그라운드 미디어 재생 기능을 앱 매니페스트에 추가합니다.
- 앱에서 CommandManager.IsEnabled 속성을 false로 설정하는 등 MediaPlayer SMTC(System Media Transport Controls)와 자동 통합을 사용하지 않도록 설정하는 경우 백그라운드 미디어 재생을 사용하도록 설정하려면 SMTC와의 수동 통합을 구현해야 합니다. 또한 MediaPlayer이외의 API(예: AudioGraph)를 사용하는 경우 수동으로 SMTC와 통합하여 앱이 백그라운드로 이동할 때 오디오가 계속 재생되도록 하려면 오디오를 재생해야 합니다. 최소 SMTC 통합 요구 사항은 시스템 미디어 전송 컨트롤
수동 제어의 "백그라운드 오디오에 시스템 미디어 전송 컨트롤 사용" 섹션에 설명되어 있습니다. - 앱이 백그라운드에 있는 동안 백그라운드 앱에 대해 시스템에서 설정한 메모리 사용량 제한을 유지해야 합니다. 백그라운드에서 메모리를 관리하기 위한 지침은 이 문서의 뒷부분에 나와 있습니다.
백그라운드 미디어 재생 명세 기능
백그라운드 오디오를 사용하도록 설정하려면 앱 매니페스트 파일 Package.appxmanifest에 백그라운드 미디어 재생 기능을 추가해야 합니다.
매니페스트 디자이너를 사용하여 앱 매니페스트에 기능을 추가하려면
- Microsoft Visual Studio의 솔루션 탐색기에서 애플리케이션 매니페스트에 대한 디자이너를 열기 위해 package.appxmanifest 항목을 두 번 클릭합니다.
- 기능 탭을 선택합니다.
- 백그라운드 미디어 재생 확인란을 선택합니다.
앱 매니페스트 xml을 수동으로 편집하여 기능을 설정하려면 먼저 uap3 네임스페이스 접두사를 Package 요소에 정의해야 합니다. 그렇지 않은 경우 아래와 같이 추가합니다.
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap uap3 mp">
다음으로 backgroundMediaPlayback 기능을 Capabilities 요소에 추가합니다.
<Capabilities>
<uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>
전경과 배경 간 전환 핸들링
앱이 포그라운드에서 백그라운드로 이동하면 EnteredBackground 이벤트가 발생합니다. 앱이 포그라운드로 돌아오면 LeavingBackground 이벤트가 발생합니다. 앱 수명 주기 이벤트이므로 앱을 만들 때 이러한 이벤트에 대한 처리기를 등록해야 합니다. 기본 프로젝트 템플릿에서 이는 App.xaml.cs App 클래스 생성자에 추가하는 것을 의미합니다.
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
this.EnteredBackground += App_EnteredBackground;
this.LeavingBackground += App_LeavingBackground;
}
현재 백그라운드에서 실행 중인지 여부를 추적하는 변수를 만듭니다.
bool _isInBackgroundMode = false;
EnteredBackground 이벤트가 발생할 때, 추적 변수를 설정하여 현재 백그라운드에서 실행 중이라는 것을 나타냅니다. 백그라운드로의 전환이 사용자에게 느리게 표시될 수 있으므로 EnteredBackground 이벤트에서 장기 실행 작업을 수행해서는 안 됩니다.
private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
_isInBackgroundMode = true;
}
LeavingBackground 이벤트 처리기에서 추적 변수를 설정하여 앱이 더 이상 백그라운드에서 실행되고 있지 않음을 나타내야 합니다.
private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
_isInBackgroundMode = false;
}
메모리 관리 요구 사항
포그라운드와 백그라운드 간 전환을 처리하는 가장 중요한 부분은 앱에서 사용하는 메모리를 관리하는 것입니다. 백그라운드에서 실행하면 시스템에서 앱이 유지할 수 있는 메모리 리소스가 줄어들기 때문에 AppMemoryUsageIncreased 및 AppMemoryUsageLimitChanging 이벤트에 등록해야 합니다. 이러한 이벤트가 발생하면 앱의 현재 메모리 사용량과 현재 제한을 확인한 다음 필요한 경우 메모리 사용량을 줄여야 합니다. 백그라운드에서 실행하는 동안 메모리 사용량을 줄이는 방법에 대한 정보를 보시려면, 앱이 백그라운드로 이동할 때 사용 가능한 메모리를 참조하세요.
백그라운드 미디어 앱의 네트워크 가용성
스트림 또는 파일에서 생성되지 않은 모든 네트워크 인식 미디어 원본은 원격 콘텐츠를 검색하는 동안 네트워크 연결을 활성 상태로 유지하고 그렇지 않은 경우 해제합니다. MediaStreamSource은, 특히, SetBufferedRange을 사용하여 애플리케이션이 플랫폼에 올바른 버퍼링된 범위를 정확히 보고하도록 의존합니다. 전체 콘텐츠가 완전히 버퍼링된 후 네트워크는 더 이상 앱을 대신하여 예약되지 않습니다.
미디어를 다운로드하지 않을 때 백그라운드에서 발생하는 네트워크 호출을 수행해야 하는 경우 반드시 MaintenanceTrigger 또는 TimeTrigger같은 적절한 작업에 래핑되어야 합니다. 자세한 내용은 앱을 백그라운드 작업으로 지원하기 를 참조하세요.
관련 항목