Ciclo de Vida de uma Aplicação Windows Phone - Windows Phone Brasil
25/07/2012 320 0
Ciclo de Vida de uma Aplicação Windows Phone
Neste tutorial vamos aprender sobre o modelo de execução de uma aplicação no Windows Phone. O entendimento deste assunto é vital para uma codificação correta em todo ciclo de vida da aplicação. Inclusive, para obter o máximo de performance deste ciclo de vida, vocês vão notar que no Windows Phone somente uma aplicação por vez roda em "foreground" (primeiro plano) no aparelho.
Note também que o sistema operacional coloca a aplicação em estado [dormente] quanto não estiver mais em primeiro plano no seu aparelho.
Internamente existe um controle de memória do sistema operacional, fazendo com que aplicações dormentes sejam terminadas (da mais atual para a menos atual) se não houver memória suficiente para rodá-las.
Este modelo de execução provê ao usuário uma experiência de navegação consistente, pois você tem a possibilidade de iniciar sua aplicação de diversos pontos como, por exemplo, através de um "tile" (ou "ladrilho") na tela inicial do aparelho.
Desta forma, antes de sair desenvolvendo algo, você deve se familiarizar com algumas terminologias, como a seguir:
Application State Dado que é usado por várias páginas em uma aplicação. Desta forma você compartilha uma mesma informação para todas as páginas que quiser, durante a vida sua aplicação.
Page State Representa o estado visual de cada página da aplicação. Por exemplo, se você tiver uma página que contém controles para o usuário informar dados, e o usuário acidentalmente sair da aplicação, quando ele voltar para esta aplicação espera-se voltar também com os dados informados anteriormente (claro que em uma [nova instância] da aplicação, este processo não deverá ocorrer).
Application Events Existem 4 eventos principais usados para o gerenciamento de estado de uma aplicação: Launching, Deactivated, Activated, e Closing.Veremos mais abaixo o significado destes eventos.
Page Events O objeto PhoneApplicationPage, da qual todas as páginas herdam, expõem dois métodos importantes: OnNavigatedTo(NavigationEventArgs) e OnNavigatedFrom(NavigationEventArgs), que sua aplicação vai sobrescrever para gerenciar o estado da página.
Tombstoning O processo na qual uma aplicação é terminada, mas algum dado sobre o estado da aplicação – e das páginas individuais dentro da aplicação – é preservado.Por exemplo, se o usuário voltar a navegar em uma aplicação neste estado (tombstoned), a aplicação é recriada e a página corrente e o histórico de navegação de páginas são restaurados automaticamente.
State Dictionaries Cada aplicação – e página – no Windows Phone provê um objeto Dictionary na qual você pode armazenar o par de valores [key/value].
A seguinte imagem ilustra o ciclo de vida de uma aplicação no Windows Phone. Neste diagrama os círculos são [estados da aplicação]. Os retângulos mostram [a aplicação, ou os eventos no nível de página onde as aplicações deveriam gerenciar seu estado].
Sumário do modelo de execução de eventos e ações da aplicação
A seguinte tabela representa uma breve sumarização dos eventos que ocorrem durante o ciclo de vida de uma aplicação e as ações que as aplicações deveriam tomar para cada evento.
Evento ou método Ação da Aplicação
Launching event Executa muito pouco código. Não faça uso de recursos de operações intensivas, como por exemplo o acesso a [isolated storage***].
OnNavigatedFrom method Não sendo uma navegação contrária (backward navigation), salva o estado da UI em um [dicionário de estado].
Deactivated event Salva o estado da aplicação na propriedade [PhoneApplicationService.State] no caso da aplicação entrar no modo [tombstoned].
Activated event Verifique a propriedade [IsApplicationInstancePreserved]. Se verdadeiro, nada precisa ser feito. Caso contrário, você pode usar o dado armazenado no dicionário [PhoneApplicationService.State] para restaurar informações.
OnNavigatedTo method Verifique se a página é uma nova instância. Se não for, você também pode usar o dicionário [PhoneApplicationService.State] para restaurar a UI.
Closing event Salve dados persistentes da aplicação para a [isolated storage***]
*** Em outros artigos falaremos sobre o significado de [isolated storage].
Muito bem, uma vez que já conhecem a teoria do ciclo de vida de uma aplicação, vamos a prática, através da criação de uma aplicação simples, passando pelos principais eventos citados acima.
– IMPORTANTE: Altere o [nome do projeto] que no exemplo da figura acima se chama [PhoneApp1] para PhoneAppLifeCycle.
– Selecione o arquivo [App.xaml] e clique com o botão direito do mouse na opção "View Code", conforme ilustrado abaixo:
– Crie uma variável string chamada [transientData] no início da classe [App]. Sua classe deverá ficar como exemplificado abaixo:
public string transientData;…
– Procure pelo método [Application_Activated] e altere este método para ficar igual ao proposto abaixo:
private void Application_Activated(object sender, ActivatedEventArgs e){if (PhoneApplicationService.Current.State.ContainsKey("td")){this.transientData = PhoneApplicationService.Current.State["td"] as string;
– Procure pelo método [Application_Deactivated] e altere este método para ficar igual ao proposto abaixo:
private void Application_Deactivated(object sender, DeactivatedEventArgs e){if (!string.IsNullOrEmpty(transientData)){PhoneApplicationService.Current.State["td"] = "TransientData: " + transientData;
A seguir abra o arquivo [MainPage.XAML] e altere TODO o conteúdo para o proposto abaixo:
<phone:PhoneApplicationPagex:Class="PhoneAppLifeCycle.MainPage"xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"xmlns:d="https://schemas.microsoft.com/expression/blend/2008″xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006″mc:Ignorable="d" d:DesignWidth="480″ d:DesignHeight="768″FontFamily="{StaticResource PhoneFontFamilyNormal}"
<TextBlock x:Name="PageTitle" Text="App Life Cycle" Margin="9,-7,0,0″ Style="{StaticResource PhoneTextTitle1Style}"/>
<TextBox Height="72″ HorizontalAlignment="Left" Margin="-10,28,0,0″ Name="textBox1″ Text="TextBox" VerticalAlignment="Top" Width="460″ />
Neste ponto sua tela deverá estar como ilustrado abaixo:
A seguir abra o arquivo [MainPage.XAML.CS] e altere TODO o conteúdo para o proposto abaixo:
namespace PhoneAppLifeCycle
(Application.Current as PhoneAppLifeCycle.App).transientData = this.textBox1.Text;
if (PhoneApplicationService.Current.State.ContainsKey("td"))
PhoneApplicationService.Current.State.Remove("td");
if (!string.IsNullOrEmpty(((Application.Current as PhoneAppLifeCycle.App).transientData)))
this.textBox1.Text = (Application.Current as PhoneAppLifeCycle.App).transientData;
// OR THAT OTHER WAY
this.textBox1.Text = PhoneApplicationService.Current.State["td"] as string;
Execute com [breakpoints do Visual Studio] sua aplicação, nos pontos:
– App.xaml.cs – [Application_Activated]
– App.xaml.cs – [Application_Deactivated]
– MainPage.xaml.cs – [OnNavigatedFrom]
– MainPage.xaml.cs – [OnNavigatedTo]
E note o "momento" em que cada um destes métodos é executado, de acordo com a ação executada na aplicação, como por exemplo: