Olá Desenvolvedores,
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.
– Abra seu Visual Studio 2010 SP1 (ou Visual Studio 2010 Express for Windows Phone)
– Menu FILE->NEW->PROJECT-> Escolha [Visual C# – Silverlight for Windows Phone]
– Neste ponto, você deverá ter uma tela parecida com a seguinte:
– IMPORTANTE: Altere o [nome do projeto] que no exemplo da figura acima se chama [PhoneApp1] para PhoneAppLifeCycle.
– Após esta tela, aparecerá outra para confirmar a versão do Windows Phone OS; escolha [Windows Phone 7.1]
– 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 partial class App : Application { 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}” FontSize=”{StaticResource PhoneFontSizeNormal}” Foreground=”{StaticResource PhoneForegroundBrush}” SupportedOrientations=”Portrait” Orientation=”Portrait” shell:SystemTray.IsVisible=”True”>
<!–LayoutRoot is the root grid where all page content is placed–> <Grid x:Name=”LayoutRoot” Background=”Transparent”> <Grid.RowDefinitions> <RowDefinition Height=”Auto”/> <RowDefinition Height=”*”/> </Grid.RowDefinitions>
<!–TitlePanel contains the name of the application and page title–> <StackPanel x:Name=”TitlePanel” Grid.Row=”0″ Margin=”12,17,0,28″> <TextBlock x:Name=”ApplicationTitle” Text=”MY APPLICATION” Style=”{StaticResource PhoneTextNormalStyle}”/> <TextBlock x:Name=”PageTitle” Text=”App Life Cycle” Margin=”9,-7,0,0″ Style=”{StaticResource PhoneTextTitle1Style}”/> </StackPanel>
<!–ContentPanel – place additional content here–> <Grid x:Name=”ContentPanel” Grid.Row=”1″ Margin=”12,0,12,0″> <TextBox Height=”72″ HorizontalAlignment=”Left” Margin=”-10,28,0,0″ Name=”textBox1″ Text=”TextBox” VerticalAlignment=”Top” Width=”460″ /> </Grid> </Grid>
<!–Sample code showing usage of ApplicationBar–> <!–<phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible=”True” IsMenuEnabled=”True”> <shell:ApplicationBarIconButton IconUri=”/Images/appbar_button1.png” Text=”Button 1″/> <shell:ApplicationBarIconButton IconUri=”/Images/appbar_button2.png” Text=”Button 2″/> <shell:ApplicationBar.MenuItems> <shell:ApplicationBarMenuItem Text=”MenuItem 1″/> <shell:ApplicationBarMenuItem Text=”MenuItem 2″/> </shell:ApplicationBar.MenuItems> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>–>
</phone:PhoneApplicationPage>
|
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:
using System;using System.Collections.Generic;using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell;
namespace PhoneAppLifeCycle { public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); }
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); (Application.Current as PhoneAppLifeCycle.App).transientData = this.textBox1.Text; if (PhoneApplicationService.Current.State.ContainsKey(“td”)) PhoneApplicationService.Current.State.Remove(“td”); }
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e);
// THAT WAY if (!string.IsNullOrEmpty(((Application.Current as PhoneAppLifeCycle.App).transientData))) this.textBox1.Text = (Application.Current as PhoneAppLifeCycle.App).transientData;
// OR THAT OTHER WAY if (PhoneApplicationService.Current.State.ContainsKey(“td”)) 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:
– clicar no botão “Start” do seu aparelho (ou do Emulador)
– clicar no botão “Back” do seu aparelho (ou do Emulador)
Note também o que acontece com o conteúdo da propriedade PhoneApplicationService.Current.State.
É isto aí! A cada novo artigo, exploraremos mais os poderosos recursos deste importante Sistema Operacional!
Abraço a todos!!
Gilberto Tezini
Comentários