Ciclo de Vida de uma Aplicação Windows Phone

15

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

https://gtezini.blogspot.com

Fonte: Execution Model Overview for Windows Phone

Share.

About Author

  • Interessantíssíssíssísssíiiiiiiiiiiiiissímo!!!

    valeu! vamos monta uma equipe de desenv de windows phone? !!

  • Daniel Medeiros

    Pessoal, alguém sabe se há alguma informação sobre o Instagram para Windows Phone?

  • Wilson Júnior

    Será que estão desenvolvendo um app para identificar qual operadora pertence todos os contados inclusive os números que discamos?
    Sei que no android tem e seria muito útil no WP.

    • Victor Becker

      Já existe…Chama-se “Qual Operadora?”. Alguma coisa do gênero!

      • Verdade, pq na marketplace até apps menos uteis como horoscopo, ou lanterna , como o flashlight X pro sao pagos? nao da pra entender isso sinceramente? Falta de dinheiro M$?

        • Carlos

          Quem define se o jogo ou o aplicativo vai ser pago não é a MS e sim o programador. Antes de sair postando o que não sabe procura entender e pesquisar pra não pagar mico.

          • ignorante , se vc nao percebeu e FIZ uma PERGUNTA, nao sai afirmando q a M$ precisa de dinheiro , e cobrar por horoscopo é foda…

            Aprende a ler , otário !

    • Wilson, existe mais de um app para isso na Marketplace. Experimente o “Qual operadora” abs

    • Wilson Júnior

      Obrigado pela dicas, achei 2 aplicativos: qual operadora e consulta operadora, sendo que o ultimo achei melhor.

  • jere

    Olá alguém sabe se tem como ativar controle de voz no omnia w?

    • Basta mudar a região do aparelho para EUA. O comando de voz será ativado, mas, infelizmente ele ainda não está disponível em nosso idioma. Funciona, mas, com comandos em inglês.

      • jere

        Valeu cara vou fazer isso!

  • Parabéns, excelente post.