App Services 讓你的 App 為其他 App 提供服務。 應用程式服務作為獨立程序中的背景任務執行,並暴露請求/回應通訊通道。 其他應用程式則使用 AppServiceConnection 連接服務。
Important
應用程式服務需要 MSIX 套件的身份。 服務提供者應用程式和用戶端應用程式都必須封裝。 未封裝的桌面應用程式無法主機或連接應用程式服務。
Note
Windows 應用程式 SDK 應用程式只能作為一個未完成的背景任務來承載應用程式服務。
Microsoft.UI.Xaml.Application不提供OnBackgroundActivated覆寫,且 ExtendedActivationKind 不包含應用程式服務啟用類型,因此 Windows 應用程式 SDK 應用程式無法像 UWP 應用程式那樣,直接在自身流程中接收應用程式服務啟用。 詳情請參見「 不支援處理中應用程式服務 」。
應用程式服務的運作方式
應用程式服務包含:
- 一個宣告並實作服務的提供者應用程式。
- 一個消費者應用程式 ,連接服務並發送請求。
通訊使用 ValueSet 物件來處理請求與回應資料。
建立應用程式服務提供者
步驟 1:在清單中宣告應用程式服務
將 appService 擴充功能新增至提供者應用程式的 Package.appxmanifest,並指定實作該服務之背景工作專案的進入點:
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="com.example.myappservice"
EntryPoint="MyAppService.ServiceTask" />
</uap:Extension>
</Extensions>
步驟二:實作服務
建立一個獨立的 Windows 執行階段 元件專案並實作 IBackgroundTask。 背景任務會以非流程方式執行,因此無論提供者應用程式是使用 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();
}
Tip
執行 PowerShell 中的 Get-AppxPackage -Name *ProviderApp* 以尋找提供者應用程式的 PackageFamilyName,或查看提供者應用程式的套件資訊清單。
為何服務必須在處理序外執行
應用程式服務的背景工作一律在其自身的行程中執行(但若僅限 UWP 提供者,則會在提供者應用程式的行程中執行)。 對於 Windows 應用程式 SDK 提供者應用程式,背景任務必須在程序外執行,因為應用程式自身的程序無法接收應用程式服務啟用。 更多資訊請參閱「 未支援處理中應用程式服務」。