Compartilhar via


Executar uma tarefa em segundo plano em um temporizador

Saiba como usar o TimeTrigger para agendar uma tarefa em segundo plano única ou executar uma tarefa periódica em segundo plano.

Consulte Scenario4 no exemplo de ativação em segundo plano para ver um exemplo de como implementar a tarefa em segundo plano disparada por tempo descrita neste tópico.

Este tópico pressupõe que você tenha uma tarefa em segundo plano que precisa ser executada periodicamente ou em um momento específico. Se você ainda não tiver uma tarefa em segundo plano, haverá uma tarefa em segundo plano de exemplo em BackgroundActivity.cs. Ou siga as etapas em Criar e registrar uma tarefa em segundo plano no processo ou Criar e registrar uma tarefa em segundo plano fora do processo para criar uma.

Criar um disparador de tempo

Criar um novo TimeTrigger. O segundo parâmetro, do OneShot, especifica se a tarefa em segundo plano será executada apenas uma vez ou continuará sendo executada periodicamente. Se OneShot for definido como true, o primeiro parâmetro (FreshnessTime) especifica o número de minutos a esperar antes de agendar a tarefa em segundo plano. Se OneShot for definido como false, FreshnessTime especifica a frequência em que a tarefa em segundo plano será executada.

O temporizador interno para aplicativos UWP (Plataforma Universal do Windows) direcionados à família de dispositivos móveis ou desktop executa tarefas em segundo plano em intervalos de 15 minutos. (O temporizador é executado em intervalos de 15 minutos para que o sistema só precise despertar uma vez a cada 15 minutos para acordar os aplicativos que solicitaram "TimerTriggers", o que economiza energia.)

  • Se FreshnessTime estiver definido como 15 minutos e OneShot for verdadeiro, a tarefa será agendada para ser executada uma única vez, começando entre 15 e 30 minutos a partir do momento em que for registrada. Se estiver definido como 25 minutos e OneShot for true, a tarefa será agendada para ser executada uma vez, começando entre 25 e 40 minutos a partir do momento em que for registrada.

  • Se FreshnessTime estiver definido como 15 minutos e OneShot for false, a tarefa será programada para ser executada a cada 15 minutos, começando entre 15 e 30 minutos a partir do momento em que for registrada. Se estiver definido como n minutos e OneShot for falso, a tarefa será agendada para ser executada a cada n minutos, começando entre n e n + 15 minutos após ser registrada.

Observação

Se FreshnessTime for definido como menos de 15 minutos, uma exceção será gerada ao tentar registrar a tarefa em segundo plano.

Por exemplo, esse gatilho fará com que uma tarefa em segundo plano seja executada uma vez por hora.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(Opcional) Adicionar uma condição

Você pode criar uma condição de tarefa em segundo plano para controlar quando a tarefa é executada. Uma condição impede que a tarefa em segundo plano seja executada até que a condição seja atendida. Para obter mais informações, consulte Definir condições para executar uma tarefa em segundo plano.

Neste exemplo, a condição é definida como UserPresent para que, uma vez disparada, a tarefa seja executada apenas quando o usuário estiver ativo. Para obter uma lista de possíveis condições, consulte SystemConditionType.

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

Para obter informações mais detalhadas sobre condições e tipos de gatilhos em segundo plano, consulte Dar suporte ao aplicativo com tarefas em segundo plano.

Chamar RequestAccessAsync()

Antes de registrar a tarefa ApplicationTrigger em segundo plano, chame RequestAccessAsync para determinar o nível de atividade em segundo plano que o usuário permite, pois o usuário pode ter desabilitado a atividade em segundo plano para seu aplicativo. Consulte Otimizar a atividade em segundo plano para obter mais informações sobre como os usuários podem controlar as configurações da atividade em segundo plano.

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
}

Registrar a tarefa em segundo plano

Registre a tarefa em segundo plano chamando sua função de registro de tarefa em segundo plano. Para obter mais informações sobre como registrar tarefas em segundo plano e ver a definição do método RegisterBackgroundTask() no código de exemplo abaixo, consulte Registrar uma tarefa em segundo plano.

Importante

Para tarefas em segundo plano executadas no mesmo processo que seu aplicativo, não defina entryPoint. Para tarefas em segundo plano executadas em um processo separado do seu aplicativo, defina entryPoint como o namespace, '.' e o nome da classe que contém a implementação da tarefa em segundo plano.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

Os parâmetros de registro de tarefa em segundo plano são validados no momento do registro. Um erro será retornado se algum dos parâmetros de registro for inválido. Verifique se seu aplicativo manipula normalmente cenários em que o registro de tarefas em segundo plano falha - se, em vez disso, seu aplicativo depender de ter um objeto de registro válido depois de tentar registrar uma tarefa, ele poderá falhar.

Gerenciar recursos para sua tarefa em segundo plano

Use BackgroundExecutionManager.RequestAccessAsync para determinar se o usuário decidiu que a atividade em segundo plano do aplicativo deve ser limitada. Lembre-se do uso da bateria e só seja executado em segundo plano quando for necessário concluir uma ação desejada pelo usuário. Consulte Otimizar a atividade em segundo plano para obter mais informações sobre como os usuários podem controlar as configurações da atividade em segundo plano.

  • Memória: ajustar a memória e o uso de energia do aplicativo é fundamental para garantir que o sistema operacional permita que sua tarefa em segundo plano seja executada. Use as APIs de Gerenciamento de Memória para ver quanta memória sua tarefa em segundo plano está usando. Quanto mais memória sua tarefa em segundo plano usa, mais difícil é para o sistema operacional mantê-la em execução quando outro aplicativo está em primeiro plano. O usuário está, em última análise, no controle de todas as atividades em segundo plano que seu aplicativo pode executar e tem visibilidade do impacto que seu aplicativo tem no uso da bateria.
  • Tempo de CPU: as tarefas em segundo plano são limitadas pela quantidade de tempo de uso do relógio de parede que recebem com base no tipo de gatilho.

Consulte Suporte seu aplicativo com tarefas em segundo plano para as restrições de recursos aplicadas a essas tarefas.

Observações

A partir do Windows 10, não é mais necessário que o usuário adicione seu aplicativo à tela de bloqueio para utilizar tarefas em segundo plano.

Uma tarefa em segundo plano só será executada usando um TimeTrigger se você tiver chamado RequestAccessAsync primeiro.