Tecnologia

27 nov, 2012

Aplicações Windows 8 – ciclo de vida e gerenciamento de estado

Publicidade

No Windows 8, você pode abrir diversos aplicativos e alternar entre eles sem ter de se preocupar com o uso de processador ou memória do sistema, pois o sistema suspende automaticamente (e às vezes termina) aplicativos que estão rodando em segundo plano para você.

Um aplicativo bem projetado pode ser suspenso, terminado e, quando solicitado pelo sistema, ser retomado como se o mesmo tivesse ficado o tempo inteiro em memória.

Nesse artigo, iremos desenvolver um aplicativo que irá salvar o seu estado quando suspenso ou terminado pelo sistema, e retornará ao seu estado anterior, quando executado novamente.

Um aplicativo pode ser suspenso quando o usuário o minimiza ou quando o Windows entra em estado de economia de energia. O aplicativo suspenso continua em memória para que o usuário possa retomá-lo de forma rápida. Nesse caso, nenhum código é exigido e o Windows gerencia a suspensão do mesmo. O Windows também pode encerrar um aplicativo suspenso a qualquer momento para liberar memória para outras aplicações ou mesmo para economizar energia. E quando isso acontece, ele é retirado totalmente da memória.

Quando fechamos um aplicativo pressionando [Alt + F4] ou usando o gesto correspondente ao fechar, o aplicativo é suspenso por dez segundos e em seguida é encerrado. O aplicativo receberá uma notificação de que está sendo suspenso, mas não irá ser notificado caso seja terminado. Com isso, devemos manipular o evento de suspensão e usá-lo para salvar seu estado e liberar recursos exclusivos de memórias, como ponteiros em arquivos por exemplo.

Para garantir uma boa experiência para o usuário e passar a impressão de que o aplicativo nunca parou de executar, precisamos manter todos os dados já inseridos pelo usuário e configurações que ele já tenha feito, salvando o estado do mesmo. Assim, caso seja necessário, podemos restaurar o aplicativo do exato ponto aonde parou.

Existem dois tipos de dados que precisamos administrar em nossos aplicativos: dados de aplicativo e dados de sessão. Vamos a um exemplo prático?

Usando o SuspensionManager

Crie um aplicativo básico no Visual Studio 2012 (caso não tenha, baixe e instale a versão express):

Clique com o botão direito do mouse na sua solução e em “adicionar novo item”. Escolha uma Basic Page:

Caso seja perguntado se deseja adicionar arquivos necessários, clique em sim. Isso irá fazer com que arquivos adicionais sejam incluídos na sua solução. Entre esses novos arquivos está o Common\SuspensionManager.cs.

Antes de iniciar o nosso código, iremos adicionar um HyperLinkButton em nossa MainPage, para que possamos navegar até a nossa BasicPage1, conforme figura abaixo:

De dois cliques no HyperLinkButon e em seu evento adicione o seguinte código:

this.Frame.Navigate(typeof(BasicPage1));

Depois de adicionado o link a nossa Home, irémos adicionar dois TextLabel e dois TextBox a nossa página (BasicPage1). O importante é nomear os TextBox como txtNome e txtSobrenome, conforme figura abaixo:

Abra o arquivo SuspensionManager. Essa classe é um helper que simplifica o gerenciamento do ciclo de vida da sua aplicação, serializando os dados de estado da página e escrevendo em um XML no local de armazenamento da aplicação.

Precisamos registrar o Frame principal, para que ele possa, então, saber de todas as páginas na aplicação e então conseguir salvar e restaurar o estado de navegação. Devemos registrar o Frame logo depois da criação no método OnLaunched no App.xaml.cs.

  • Duplo clique App.xaml.cs no Solution Explorer;
  • No método OnLaunched, utilize o metodo SuspensionManager.RegisterFrame para registrar o Frame principal.
CicloVidaWindows8App.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");

Adicione este código depois que o Frame é criado, conforme exemplo abaixo:

if (rootFrame == null)

{

rootFrame = new Frame();

CicloVidaWindows8App.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");

Salvando o status da aplicação

Existem dois tipos de dados para você gerenciar em sua aplicação: dados da aplicação e dados da sessão. Os dados da aplicação são persistentes durante diferentes sessões e devem estar acessíveis para o usuário.

O Windows nos fornece um objeto para ajudar no gerenciamento desses dados: Windows.Storage.ApplicationData. Este objeto tem uma propriedade RoamingSettings que retorna um objeto do tipo ApplicationDataContainer, que podemos utilizar para armazenar dados que precisam ser persistidos através das sessões.

O passo a passo a seguir, irá mostrar como utilizar o RoamingSettings, ele torna o armazenamento fácil e acessível através de múltiplas máquinas. Basicamente, os dados são enviados para a nuvem em background para você. Você pode utilizar LocalSettings, mas devemos fazer essa opção, apenas quando quiser armazenar informações específicas da máquina.

Para salvar os dados do aplicativo

Adicione o código abaixo no evento TextChanged do Textbox txtName que adicionamos a nossa BasicPage1:

Windows.Storage.ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
roamingSettings.Values["userName"] = txtName.Text;

Para salvar o estado da sessão

 Adicione a palavra-chave async à assinatura do método OnSuspending no arquivo App.xaml.cs e coloque o seguinte código dentro desse método:

await CicloVidaWindows8App.Common.SuspensionManager.SaveAsync();

O código deverá ficar assim:

private async void OnSuspending(object sender, SuspendingEventArgs e)

{

var deferral = e.SuspendingOperation.GetDeferral();

//TODO: Save application state and stop any background activity

await CicloVidaWindows8App.Common.SuspensionManager.SaveAsync();

deferral.Complete();

}

A chamada a SaveAsync salva o estado de navegação do Frame e permite que a Page salve o respectivo conteúdo.

No arquivo BasicPage1.xaml.cs, adicione este código ao método SaveState para salvar o estado da página.

pageState["txtSobrenome"] = txtSobrenome.Text;

A classe SuspensionManager serializa e salva o dicionário pageState em um arquivo XML. Os dados salvos serão salvos somente para esta sessão. O código deverá ficar assim:

protected override void SaveState(Dictionary<String, Object> pageState)

{

pageState["txtSobrenome"] = txtSobrenome.Text;

}

Agora já temos o estado da aplicação salvo. Precisamos apenas recuperá-lo quando a aplicação for restaurada.

Recuperar o estado da aplicação

  •  No App.xaml.cs, adicione a palavra-chave async à assinatura do método OnLaunched:
protected async override void OnLaunched(LaunchActivatedEventArgs args)
  • Se o aplicativo tiver sido encerrado, chame o método SuspensionManager.RestoreAsync:
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)

            {

                //TODO: Load state from previously suspended application

                await CicloVidaWindows8App.Common.SuspensionManager.RestoreAsync();

            }
  • Em BasicPage1.xaml.cs, adicione um código ao método LoadState para restaurar o estado da página.
if (pageState != null && pageState.ContainsKey("txtSobrenome"))

{

txtSobrenome.Text = pageState["txtSobrenome"].ToString();

}

Windows.Storage.ApplicationDataContainer roamingSettings =

Windows.Storage.ApplicationData.Current.RoamingSettings;

if (roamingSettings.Values.ContainsKey("userName"))

{

txtName.Text = roamingSettings.Values["userName"].ToString();

}

Para simular a suspensão, o encerramento e a restauração de um aplicativo no Visual Studio:

  • Pressione F5 para executar o aplicativo no modo debug;
  • Insira os dados;
  • Pressione Alt+Tab para voltar ao Visual Studio;
  • Abra o menu suspenso ao lado do botão Suspender na barra de ferramentas Depurar Local;

A barra de ferramentas Depurar Local é exibida por padrão enquanto o depurador está em execução. Se ela não estiver visível, clique em Exibir > Barras de Ferramentas > Depurar Local para exibi-la.

 

  • Selecione suspender e encerrar.

O Visual Studio simulará a suspensão e o encerramento do aplicativo. Assim, o evento Suspending ocorrerá e o código de gerenciamento de estado será executado.

  • Pressione F5 para executar o aplicativo novamente. O aplicativo será restaurado em seu estado anterior;
  • Altere o nome na caixa de texto;
  • Pressione Alt+Tab para voltar ao Visual Studio;
  • Selecione Depurar > Parar Depuração para fechar o aplicativo;
  • Pressione F5 para executar o aplicativo novamente.

Agora, o nome será restaurado, pois foi salvo à medida que você o digitou. O sobrenome não será restaurado porque o evento Suspending não ocorreu, então o estado da sessão não foi salvo.

É isso aí. Agora já sabemos como armazenar o status de nosso aplicativo.

Baixe nosso exemplo aqui: CicloVidaWindows8App.zip (287,46 kb)

Até a próxima!