앱 서비스를 사용하면 앱이 다른 앱에 서비스를 제공할 수 있습니다. 앱 서비스는 별도의 프로세스에서 백그라운드 작업으로 실행되며 요청/응답 통신 채널을 노출합니다. 다른 앱은 AppServiceConnection을 사용하여 서비스에 연결합니다.
Important
앱 서비스에는 MSIX 패키지 ID가 필요합니다. 공급자 및 소비자 앱은 모두 패키지되어야 합니다. 패키지되지 않은 데스크톱 앱은 앱 서비스를 호스트하거나 연결할 수 없습니다.
메모
Windows 앱 SDK 앱은 out-of-process 백그라운드 작업으로만 앱 서비스를 호스트할 수 있습니다.
Microsoft.UI.Xaml.Application에서는 재정의를 OnBackgroundActivated 제공하지 않으며 ExtendedActivationKind에는 앱 서비스 활성화 종류가 포함되지 않으므로 Windows 앱 SDK 앱은 UWP 앱이 할 수 있는 방식으로 자체 프로세스에서 직접 앱 서비스 활성화를 받을 수 없습니다. 자세한 내용은 In-Process 앱 서비스가 지원되지 않음 을 참조하세요.
앱 서비스의 작동 방식
앱 서비스는 다음으로 구성됩니다.
- 서비스를 선언하고 구현하는 공급자 앱입니다.
- 서비스에 연결하고 요청을 보내는 소비자 앱입니다.
통신은 요청 및 응답 데이터에 ValueSet 개체를 사용합니다.
앱 서비스 공급자 만들기
1단계: 매니페스트에서 앱 서비스 선언
appService 공급자 앱Package.appxmanifest에 확장을 추가하고 서비스를 구현하는 백그라운드 작업 프로젝트의 진입점을 지정합니다.
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="com.example.myappservice"
EntryPoint="MyAppService.ServiceTask" />
</uap:Extension>
</Extensions>
2단계: 서비스 구현
별도의 Windows 런타임 구성 요소 프로젝트를 만들고 구현IBackgroundTask합니다. 백그라운드 작업은 out-of-process로 실행되므로 이 패턴은 공급자 앱이 Windows 앱 SDK 또는 UWP를 사용하여 빌드되었는지 여부에 관계없이 작동합니다.
// MyAppService.ServiceTask, in a separate Windows Runtime Component project
public sealed class ServiceTask : IBackgroundTask
{
private BackgroundTaskDeferral _deferral;
public void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
taskInstance.Canceled += OnTaskCanceled;
var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
if (details != null)
{
details.AppServiceConnection.RequestReceived += OnRequestReceived;
}
}
private async void OnRequestReceived(AppServiceConnection sender,
AppServiceRequestReceivedEventArgs args)
{
var deferral = args.GetDeferral();
var response = new ValueSet();
response.Add("result", "Hello from the service!");
await args.Request.SendResponseAsync(response);
deferral.Complete();
}
private void OnTaskCanceled(IBackgroundTaskInstance sender,
BackgroundTaskCancellationReason reason)
{
_deferral?.Complete();
}
}
앱 서비스 사용
소비자 앱에서 AppServiceConnection을 생성하고 요청을 보냅니다:
using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;
private async Task CallAppServiceAsync()
{
var connection = new AppServiceConnection
{
AppServiceName = "com.example.myappservice",
PackageFamilyName = "ProviderApp_1234567890abc"
};
var status = await connection.OpenAsync();
if (status != AppServiceConnectionStatus.Success)
{
// Handle connection failure
return;
}
var request = new ValueSet
{
{ "command", "add" },
{ "a", 5 },
{ "b", 3 }
};
var response = await connection.SendMessageAsync(request);
if (response.Status == AppServiceResponseStatus.Success)
{
int result = (int)response.Message["result"];
// result is 8
}
connection.Dispose();
}
팁 (조언)
PowerShell에서 Get-AppxPackage -Name *ProviderApp*을 실행하여 공급자 앱의 PackageFamilyName을 찾거나, 공급자 앱의 패키지 매니페스트를 확인합니다.
서비스가 별도 프로세스로 실행되어야 하는 이유
앱 서비스의 백그라운드 작업은 항상 자체 프로세스(또는 UWP 공급자에 대해서만 공급자 앱의 프로세스)에서 실행됩니다. Windows 앱 SDK 공급자 앱의 경우, 앱 자체 프로세스는 앱 서비스 활성화를 받을 수 있는 지원되는 방식이 없으므로 백그라운드 작업은 별도 프로세스에서 실행되어야 합니다. 자세한 내용은 In-process 앱 서비스가 지원되지 않음을 참조하세요.
관련 콘텐츠
Windows developer