Clique e receba as novidades quentinhas no Telegram

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 StateDado 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 StateRepresenta 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 EventsExistem 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 EventsO 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.
TombstoningO 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 DictionariesCada 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étodoAção da Aplicação
Launching eventExecuta muito pouco código. Não faça uso de recursos de operações intensivas, como por exemplo o acesso a [isolated storage***].
OnNavigatedFrom methodNão sendo uma navegação contrária (backward navigation), salva o estado da UI em um [dicionário de estado].
Deactivated eventSalva o estado da aplicação na propriedade [PhoneApplicationService.State] no caso da aplicação entrar no modo [tombstoned].
Activated eventVerifique 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 methodVerifique 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 eventSalve 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

https://gtezini.blogspot.com

Fonte: Execution Model Overview for Windows Phone