Declarar tarefas em segundo plano no manifesto do app
APIs importantes
Habilite o uso de tarefas em segundo plano declarando-as como extensões no manifesto do aplicativo.
Importante
Este artigo é específico para tarefas em segundo plano fora do processo. As tarefas em segundo plano em processo não são declaradas no manifesto.
As tarefas em segundo plano fora do processo devem ser declaradas no manifesto do aplicativo, caso contrário, seu aplicativo não poderá registrá-las (uma exceção será gerada). Além disso, as tarefas em segundo plano fora do processo devem ser declaradas no manifesto do aplicativo para passar na certificação.
Este tópico pressupõe que você tenha criado uma ou mais classes de tarefa em segundo plano e que seu aplicativo registre cada tarefa em segundo plano a ser executada em resposta a pelo menos um gatilho.
Adicionar extensões manualmente
Abra o manifesto do aplicativo (Package.appxmanifest) e vá para o elemento Application. Crie um elemento Extensions (se ainda não existir).
O snippet a seguir é obtido do exemplo de tarefa em segundo plano:
<Application Id="App"
...
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
<BackgroundTasks>
<Task Type="systemEvent"/>
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
Adicionar uma extensão de tarefa em segundo plano
Declare sua primeira tarefa em segundo plano.
Copie esse código para o elemento Extensions (você adicionará atributos nas etapas a seguir).
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
Altere o atributo EntryPoint para ter a mesma cadeia de caracteres usada pelo código como o ponto de entrada ao registrar sua tarefa em segundo plano (namespace.classname).
Neste exemplo, o ponto de entrada é ExampleBackgroundTaskNameSpace.ExampleBackgroundTaskClassName:
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTaskClassName">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
Altere a lista do atributo Tipo de Tarefa para indicar o tipo de registro de tarefa usado com essa tarefa em segundo plano. Se a tarefa em segundo plano estiver registrada com vários tipos de gatilho, adicione elementos Task e atributos Type adicionais para cada um.
Observação Certifique-se de listar cada um dos tipos de gatilho que você está usando, ou a tarefa em segundo plano não será registrada com os tipos de gatilho não declarados (o método Register falhará e gerará uma exceção).
Este exemplo de snippet indica o uso de gatilhos de eventos do sistema e notificações por push:
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="pushNotification" />
</BackgroundTasks>
</Extension>
Adicionar várias extensões de tarefas em segundo plano
Repita a etapa 2 para cada classe de tarefa em segundo plano adicional registrada pelo seu aplicativo.
O exemplo a seguir é o elemento Application completo do exemplo de tarefa em segundo plano. Isso mostra o uso de 2 classes de tarefa em segundo plano com um total de 3 tipos de gatilho. Copie a seção Extensões deste exemplo e modifique-a conforme necessário para declarar tarefas em segundo plano no manifesto do aplicativo.
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="BackgroundTask.App">
<uap:VisualElements
DisplayName="BackgroundTask"
Square150x150Logo="Assets\StoreLogo-sdk.png"
Square44x44Logo="Assets\SmallTile-sdk.png"
Description="BackgroundTask"
BackgroundColor="#00b2f0">
<uap:LockScreen Notification="badgeAndTileText" BadgeLogo="Assets\smalltile-Windows-sdk.png" />
<uap:SplashScreen Image="Assets\Splash-sdk.png" />
<uap:DefaultTile DefaultSize="square150x150Logo" Wide310x150Logo="Assets\tile-sdk.png" >
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo" />
<uap:ShowOn Tile="wide310x150Logo" />
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
<BackgroundTasks>
<Task Type="systemEvent"/>
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Declare onde sua tarefa em segundo plano será executada
Você pode especificar onde suas tarefas em segundo plano são executadas:
- Por padrão, eles são executados no processo BackgroundTaskHost.exe.
- No mesmo processo que seu aplicativo em primeiro plano.
- Use
ResourceGroup
para colocar várias tarefas em segundo plano no mesmo processo de hospedagem ou para separá-las em processos diferentes. - Use
SupportsMultipleInstances
para executar o processo em segundo plano em um novo processo que obtém seus próprios limites de recursos (memória, cpu) sempre que um novo gatilho é disparado.
Execute no mesmo processo que seu aplicativo em primeiro plano
Aqui está um exemplo de XML que declara uma tarefa em segundo plano que é executada no mesmo processo que o aplicativo em primeiro plano.
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="ExecModelTestBackgroundTasks.ApplicationTriggerTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
</Extensions>
Quando você especifica EntryPoint, seu aplicativo recebe um retorno de chamada para o método especificado quando o gatilho é acionado. Se você não especificar um EntryPoint, seu aplicativo receberá o retorno de chamada por meio de OnBackgroundActivated(). Consulte Criar e registrar uma tarefa em segundo plano em processo para obter detalhes.
Especifique onde sua tarefa em segundo plano é executada com o atributo ResourceGroup.
Aqui está um exemplo de XML que declara uma tarefa em segundo plano que é executada em um processo BackgroundTaskHost.exe, mas em um processo separado de outras instâncias de tarefas em segundo plano do mesmo aplicativo. Observe o ResourceGroup
atributo, que identifica quais tarefas em segundo plano serão executadas juntas.
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.SessionConnectedTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimeZoneTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.ApplicationTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.MaintenanceTriggerTask" ResourceGroup="foobar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
</Extensions>
Execute em um novo processo sempre que um gatilho for acionado com o atributo SupportsMultipleInstances
Este exemplo declara uma tarefa em segundo plano que é executada em um novo processo que obtém seus próprios limites de recursos (memória e CPU) sempre que um novo gatilho é disparado. Observe que o uso de SupportsMultipleInstances
que habilita esse comportamento. Para usar esse atributo, você deve direcionar a versão do SDK '10.0.15063' (Windows 10 Creators Update) ou posterior.
<Package
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
...
<Applications>
<Application ...>
...
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask">
<BackgroundTasks uap4:SupportsMultipleInstances="true">
<Task Type="timer" />
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Observação
Você não pode especificar ResourceGroup
ou ServerName
em conjunto com SupportsMultipleInstances
.