Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo mostra-lhe como usar a execução estendida para adiar a suspensão do seu aplicativo, permitindo-lhe continuar a funcionar enquanto minimizado ou sob a tela de bloqueio.
Quando o usuário minimiza ou se afasta de um aplicativo, ele é colocado em um estado suspenso. Sua memória é mantida, mas seu código não é executado. Isso é verdade em todas as edições do sistema operacional com uma interface de usuário visual. Para obter mais detalhes sobre quando seu aplicativo é suspenso, consulte Application Lifecycle.
Há casos em que um aplicativo pode precisar continuar em execução, em vez de ser suspenso, quando o usuário navega para longe do aplicativo ou enquanto ele está minimizado. Por exemplo, um aplicativo de contagem de etapas precisa continuar executando e rastreando etapas mesmo quando o usuário navega para usar outros aplicativos.
Se um aplicativo precisar continuar em execução, o sistema operacional pode mantê-lo em execução ou pode solicitar para continuar em execução. Por exemplo, ao reproduzir áudio em segundo plano, o SO pode manter uma aplicação a funcionar durante mais tempo se seguir estes passos para Reprodução de multimédia em segundo plano. Caso contrário, você deve solicitar manualmente mais tempo. A quantidade de tempo que você pode obter para executar a execução em segundo plano pode ser de vários minutos, mas você deve estar preparado para lidar com a sessão que está sendo revogada a qualquer momento. Essas restrições de tempo do ciclo de vida da aplicação são desabilitadas enquanto a aplicação está a ser executada sob um debugger. Por esse motivo, é importante testar a Execução Estendida e outras ferramentas para adiar a suspensão do aplicativo enquanto não estiver em execução sob um depurador ou usando os Eventos do Ciclo de Vida disponíveis no Visual Studio.
Crie um ExtendedExecutionSession para solicitar mais tempo para concluir uma operação em segundo plano. O tipo de ExtendedExecutionSession que você cria é determinado pelo ExtendedExecutionReason que você fornece ao criá-lo. Há três valores enumerados de ExtendedExecutionReason: Unspecified, LocationTracking e SavingData. Apenas uma
Executar enquanto minimizado
Há dois casos em que a execução estendida pode ser usada:
- Em qualquer ponto durante a execução regular de primeiro plano, enquanto o aplicativo estiver no estado de execução.
- Depois que o aplicativo receber um evento de suspensão (o sistema operacional está prestes a mover o aplicativo para o estado suspenso) no manipulador de eventos de suspensão do aplicativo.
O código para esses dois casos é o mesmo, mas o aplicativo se comporta um pouco diferente em cada um. No primeiro caso, o aplicativo permanece no estado de execução, mesmo que ocorra um evento que normalmente acionaria a suspensão (por exemplo, o usuário navegando para fora do aplicativo). O aplicativo nunca receberá um evento de suspensão enquanto a extensão de execução estiver em vigor. Quando a prorrogação é disposta, o pedido torna-se elegível para suspensão novamente.
No segundo caso, se o aplicativo estiver em transição para o estado suspenso, ele permanecerá em um estado de suspensão pelo período da extensão. Quando a extensão expirar, o aplicativo entra no estado suspenso sem notificação adicional.
Use ExtendedExecutionReason.Unspecified ao criar um ExtendedExecutionSession para solicitar tempo adicional antes que seu aplicativo seja movido para o segundo plano para cenários como processamento de mídia, compilação de projeto ou manutenção ativa de uma conexão de rede. Em dispositivos desktop que executam o Windows 10 para edições de área de trabalho (Home, Pro, Enterprise e Education), essa é a abordagem a ser usada se um aplicativo precisar evitar ser suspenso enquanto estiver minimizado.
Solicite a extensão ao iniciar uma operação de longa duração para adiar a Suspender transição de estado que, de outra forma, ocorre quando o aplicativo é movido para segundo plano. Em dispositivos desktop, sessões de execução estendidas criadas com ExtendedExecutionReason.Unspecified têm um limite de tempo com reconhecimento de bateria. Se o dispositivo estiver conectado à alimentação da parede, não há limite para a duração do período de tempo de execução estendido. Se o dispositivo estiver com bateria, o período de tempo de execução estendido pode ser executado até dez minutos em segundo plano.
Um utilizador de tablet ou laptop pode obter o mesmo comportamento de longa duração—à custa da vida útil da bateria—quando a opção Permitir que a aplicação execute tarefas em segundo plano estiver selecionada em Configurações de Uso da Bateria por Aplicação. (Para encontrar esta opção num portátil, aceda a Definições>Sistema>Bateria>Utilização da bateria por App (a ligação sob a percentagem de energia restante da bateria) > selecione uma aplicação > desativar Managed By Windows> selecione Permitir que a aplicação execute tarefas em segundo plano.
Em todas as edições do SO, este tipo de sessão de execução prolongada para quando o dispositivo entra no Modo de Espera Ligado. Em dispositivos móveis que executam o Windows 10 Mobile, esse tipo de sessão de execução estendida será executado enquanto a tela estiver ligada. Quando o ecrã se desliga, o dispositivo tenta imediatamente entrar no modo de Connected-Standby de baixo consumo de energia. Em dispositivos desktop, a sessão continuará sendo executada se a tela de bloqueio aparecer. O dispositivo não entra no modo de espera conectado por um período de tempo depois que a tela desliga. No Xbox OS Edition, o dispositivo entra em Conexão em Espera após uma hora, a menos que o usuário altere o padrão.
Rastreie a localização do usuário
Especifique
Uma sessão de execução estendida de rastreamento de local pode ser executada pelo tempo necessário, inclusive enquanto a tela estiver bloqueada em um dispositivo móvel. No entanto, só pode haver uma sessão desse tipo em execução por dispositivo. Uma sessão de execução estendida de rastreio de localização só pode ser solicitada em primeiro plano, e a aplicação deve estar no estado Execução. Isso garante que o usuário esteja ciente de que o aplicativo iniciou uma sessão estendida de rastreamento de localização. Ainda é possível usar o GeoLocator enquanto o aplicativo está em segundo plano usando uma tarefa em segundo plano ou um serviço de aplicativo, sem solicitar uma sessão de execução estendida de rastreamento de localização.
Salve dados críticos localmente
Especifique ExtendedExecutionReason.SavingData ao criar um ExtendedExecutionSession para guardar dados do utilizador no caso de não guardar os dados antes de o aplicativo ser encerrado, o que resultará em perda de dados e uma experiência negativa para o utilizador.
Não use esse tipo de sessão para estender a vida útil de um aplicativo para carregar ou baixar dados. Se precisar fazer upload de dados, solicite uma transferência em segundo plano ou registe um MaintenanceTrigger para lidar com a transferência quando a corrente alternada (CA) estiver disponível. Uma sessão de execução estendida ExtendedExecutionReason.SavingData pode ser solicitada quando a aplicação está em primeiro plano e no estado Executando, ou em segundo plano e no estado suspending.
O estado de Suspensão é a última oportunidade no ciclo de vida de uma aplicação em que a aplicação pode realizar trabalho antes de ser encerrada.
Solicitação, eliminação e revogação
Há três interações fundamentais numa sessão estendida de execução: a solicitação, o descarte e a revogação. Fazer a solicitação é modelado no trecho de código a seguir.
Solicitação
var newSession = new ExtendedExecutionSession();
newSession.Reason = ExtendedExecutionReason.Unspecified;
newSession.Revoked += SessionRevoked;
ExtendedExecutionResult result = await newSession.RequestExtensionAsync();
switch (result)
{
case ExtendedExecutionResult.Allowed:
DoLongRunningWork();
break;
default:
case ExtendedExecutionResult.Denied:
DoShortRunningWork();
break;
}
Chamar RequestExtensionAsync verifica com o sistema operativo se o utilizador aprovou a atividade em segundo plano para a aplicação e se o sistema tem os recursos disponíveis para permitir a execução em segundo plano. Apenas uma sessão será aprovada para um aplicativo a qualquer momento, fazendo com que chamadas adicionais para RequestExtensionAsync resultem na negação da sessão.
Você pode verificar o BackgroundExecutionManager com antecedência para determinar o BackgroundAccessStatus, que é a configuração do usuário que indica se seu aplicativo pode ser executado em segundo plano ou não. Para saber mais sobre essas configurações de usuário, consulte Atividade em segundo plano e Conscientização de energia.
O ExtendedExecutionReason indica a operação que seu aplicativo está executando em segundo plano. A cadeia de caracteres Description é uma cadeia de caracteres legível por humanos que explica por que seu aplicativo precisa executar a operação. Essa cadeia de caracteres não é apresentada ao usuário, mas pode ser disponibilizada em uma versão futura do Windows. O manipulador de eventos Revogado é necessário para que uma sessão de execução estendida possa parar normalmente se o usuário, ou o sistema, decidir que o aplicativo não pode mais ser executado em segundo plano.
Revogado
Se um aplicativo tiver uma sessão de execução estendida ativa e o sistema exigir que a atividade em segundo plano seja interrompida porque um aplicativo em primeiro plano requer os recursos, a sessão será revogada. Um período de tempo de sessão de execução estendido nunca é encerrado sem primeiro disparar o manipulador de eventos
Quando o evento Revoked é acionado para uma sessão de execução estendida ExtendedExecutionReason.SavingData, o aplicativo tem um segundo para finalizar a operação que estava executando e concluir Suspender.
A revogação pode ocorrer por vários motivos: um limite de tempo de execução foi atingido, uma cota de energia em segundo plano foi atingida ou a memória precisa ser recuperada para que o usuário abra um novo aplicativo em primeiro plano.
Aqui está um exemplo de um manipulador de eventos revogado:
private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
switch (args.Reason)
{
case ExtendedExecutionRevokedReason.Resumed:
rootPage.NotifyUser("Extended execution revoked due to returning to foreground.", NotifyType.StatusMessage);
break;
case ExtendedExecutionRevokedReason.SystemPolicy:
rootPage.NotifyUser("Extended execution revoked due to system policy.", NotifyType.StatusMessage);
break;
}
EndExtendedExecution();
});
}
Eliminar
A etapa final é descartar a sessão de execução estendida. Você deseja descartar a sessão e quaisquer outros ativos que consomem muita memória, pois, caso contrário, a energia usada pelo aplicativo enquanto aguarda o encerramento da sessão será contada em relação à cota de energia do aplicativo. Para preservar o máximo possível da cota de energia do aplicativo, é importante descartar a sessão quando terminar o trabalho na sessão, para que o aplicativo possa passar para o estado Suspenso mais rapidamente.
Eliminar a sessão sozinho, em vez de esperar pelo evento de revogação, reduz o uso da cota de energia do seu aplicativo. Isso significa que seu aplicativo poderá ser executado em segundo plano por mais tempo em sessões futuras, pois você terá mais cotas de energia disponíveis para isso. Você deve manter uma referência ao objeto ExtendedExecutionSession até à finalização da operação para que possa chamar o seu método Dispose.
Segue-se um fragmento que encerra uma sessão de execução estendida:
void ClearExtendedExecution(ExtendedExecutionSession session)
{
if (session != null)
{
session.Revoked -= SessionRevoked;
session.Dispose();
session = null;
}
}
Uma aplicação só pode ter uma ExtendedExecutionSession ativa de cada vez. Muitos aplicativos usam tarefas assíncronas para concluir operações complexas que exigem acesso a recursos como armazenamento, rede ou serviços baseados em rede. Se uma operação exigir várias tarefas assíncronas para ser concluída, o estado de cada uma dessas tarefas deverá ser contabilizado antes de descartar o ExtendedExecutionSession e permitir que o aplicativo seja suspenso. Isso requer contar o número de tarefas em execução e não encerrar a sessão até que esse valor atinja zero.
Aqui está um exemplo de código para gerenciar várias tarefas durante um período de sessão de execução estendido. Para obter mais informações sobre como usar isso em seu aplicativo, consulte o exemplo de código vinculado abaixo:
static class ExtendedExecutionHelper
{
private static ExtendedExecutionSession session = null;
private static int taskCount = 0;
public static bool IsRunning
{
get
{
if (session != null)
{
return true;
}
else
{
return false;
}
}
}
public static async Task<ExtendedExecutionResult> RequestSessionAsync(ExtendedExecutionReason reason, TypedEventHandler<object, ExtendedExecutionRevokedEventArgs> revoked, String description)
{
// The previous Extended Execution must be closed before a new one can be requested.
ClearSession();
var newSession = new ExtendedExecutionSession();
newSession.Reason = reason;
newSession.Description = description;
newSession.Revoked += SessionRevoked;
// Add a revoked handler provided by the app in order to clean up an operation that had to be halted prematurely
if(revoked != null)
{
newSession.Revoked += revoked;
}
ExtendedExecutionResult result = await newSession.RequestExtensionAsync();
switch (result)
{
case ExtendedExecutionResult.Allowed:
session = newSession;
break;
default:
case ExtendedExecutionResult.Denied:
newSession.Dispose();
break;
}
return result;
}
public static void ClearSession()
{
if (session != null)
{
session.Dispose();
session = null;
}
taskCount = 0;
}
public static Deferral GetExecutionDeferral()
{
if (session == null)
{
throw new InvalidOperationException("No extended execution session is active");
}
taskCount++;
return new Deferral(OnTaskCompleted);
}
private static void OnTaskCompleted()
{
if (taskCount > 0)
{
taskCount--;
}
//If there are no more running tasks than end the extended lifetime by clearing the session
if (taskCount == 0 && session != null)
{
ClearSession();
}
}
private static void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
{
//The session has been prematurely revoked due to system constraints, ensure the session is disposed
if (session != null)
{
session.Dispose();
session = null;
}
taskCount = 0;
}
}
Certifique-se de que seu aplicativo usa bem os recursos
Ajustar a memória e o uso de energia do seu aplicativo é fundamental para garantir que o sistema operacional permita que seu aplicativo continue a ser executado quando não for mais o aplicativo em primeiro plano. Use as APIs de Gerenciamento de Memória para ver a quantidade de memória que a sua aplicação está a usar. Quanto mais memória seu aplicativo usar, mais difícil será para o sistema operacional manter seu aplicativo em execução quando outro aplicativo estiver em primeiro plano. Em última análise, o usuário controla toda a atividade em segundo plano que seu aplicativo pode executar e tem visibilidade sobre o impacto que seu aplicativo tem no uso da bateria.
Use BackgroundExecutionManager.RequestAccessAsync para determinar se o usuário decidiu que a atividade em segundo plano do seu aplicativo deve ser limitada. Esteja atento ao uso da bateria e só execute em segundo plano quando for necessário concluir uma ação que o usuário deseja.
Ver também
Exemplo de execução estendida
Ciclo de vida da aplicação
Ciclo de vida do aplicativo - Mantenha os aplicativos ativos com tarefas em segundo plano e execução estendidagerenciamento de memória em segundo plano
Transferências em segundo plano
Consciência da bateria e atividade em segundo plano
MemoryManager classe
Reproduzir mídia em segundo plano