Android

29 jun, 2018

Mudanças de configuração no Android e estado da Activity

Publicidade

Recentemente falei sobre o que é uma Activity, como é iniciada e seu ciclo de vida básico. Hoje, falaremos sobre as mudanças de configuração no Android, que podem influenciar de forma negativa a experiência do usuário final e são muitas vezes esquecidas pelos desenvolvedores, principalmente os que estão começando agora.

Bora lá?

O que são mudanças de configuração no Android?

De uma forma bem simples, são eventos específicos nos quais a plataforma reconstrói uma Activity por completo, chamando seu método onDestroy e depois o onCreate, seguidos dos devidos ciclos de vida.

Seguem alguns exemplos deste tipo de mudança:

  • Troca de orientação de tela (de horizontal para vertical e vice-versa), que acontece quando o usuário gira o dispositivo;
  • Troca de idioma por meio das configurações do Android;
  • Quando o aplicativo está em segundo plano e o Android decide matar o aplicativo para liberar memória.

No Android, as mudanças de configuração são necessárias para que o aplicativo que está sendo executado se adeque conforme a necessidade, – seja a mudança de idioma do aparelho ou de orientação de tela – entregando recursos alternativos e uma ótima experiência ao usuário final.

Imagine um cenário no qual o usuário decide girar o telefone e com isso o seu aplicativo para de funcionar inesperadamente? Ou o novo estado do aplicativo não corresponde ao último estado antes dessa ação? Vai dar ruim, né?

Daí a necessidade de todo desenvolvedor Android conhecer e saber como salvar o estado atual da Activity, além de ajudar a não passar vergonha durante uma Review, por exemplo. Vamos ver como isso funciona na prática com um caso bem simples?

Considere um aplicativo que controla o placar de um jogo qualquer, exibindo os pontos dos Time A e B. Ao clicar no botão “TIME A”, a pontuação deste time é incrementada em mais um, e o mesmo acontece para o Time B.

Agora imagine a situação na qual o placar está 3 a 2 para o Time B e o usuário gira a tela do telefone. Se o desenvolvedor não se preocupar com esse evento, as pontuações serão zeradas.

Então, como salvar o estado da tela? Fique tranquilo porque é bem fácil.

A própria plataforma do Android se preocupou com isso e, ao detectar uma mudança de configuração, dispara um método chamado onSaveInstanceState antes de a Activity ser destruída. É neste método que vamos guardar a pontuação atual dos dois times para restaurarmos o estado quando a Activity for recriada. Dessa forma:

Entendendo o método onSaveInstanceState

Como vimos acima, este método recebe um objeto do tipo android.os.Bundle com o nome outState. Um Bundle é um objeto fornecido pela própria plataforma e é do tipo ArrayMap, uma estrutura de dados genérica do tipo chave-valor, estrutura de dados otimizada para ser mais eficiente em questões de memória que o tradicional HashMap. Desta forma, podemos utilizar esse objeto já instanciado e guardar os valores com base em seus tipos, já que o objeto nos fornece métodos para guardar valores de vários tipos.

Portanto, já sabemos que esse objeto é designado para guardar valores com base em seus tipos e identificados por chaves do tipo String, conforme vimos na explicação e código anteriores. Dessa forma, definimos e usamos as chaves pontosTimeA e pontosTimeB para identificar os valores que devem ser salvos no objeto do tipo Bundle.

Como recuperar o estado da tela após recriação da Activity

Agora que sabemos como guardar o estado de uma Activity, precisamos recuperar este estado na recriação da tela. O Android fornece duas opções para isso: a primeira e mais usual é o método onCreate e a segunda, que é menos usual porque depende de situações mais específicas, é pelo método onRestoreInstanceState. Ambos relacionados ao ciclo de vida da Activity. No nosso exemplo vamos recuperar os dados pelo tradicional método onCreate:

Repare que o mesmo objeto do tipo Bundle utilizado no método onSaveInstanceState é passado para o método onCreate da nossa Activity. Interessante isso, hein? Agora você já sabe para quê serve esse objeto que sempre está presente no método onCreate que, por padrão, é nulo e sempre passava despercebido.

Como você já deve imaginar, os dados que salvamos antes da destruição da Activity estarão armazenados neste objeto durante a criação da nova Activity. O que precisamos fazer é recuperar os dados e defini-los novamente nos componentes de texto que exibem o placar dos dois times. Depois desse processo, temos nosso aplicativo funcionando corretamente, mesmo após girar a tela do telefone, assim:

Fechado? Neste artigo vimos como manter dados em uma Activity com recursos já amplamente utilizados. É importante lembrar que essa forma de gerenciar informações é eficaz e simples, diante da essencial necessidade de pensarmos em situações adversas no fluxo das aplicações. O código deste exemplo está disponível no meu GitHub, se você quiser, é só dar uma olhada lá!

Em breve voltarei para falar sobre Intents no Android: o que é e para que serve.

Até lá!

***

Este artigo foi publicado originalmente em: https://www.concrete.com.br/2018/06/01/mudancas-de-configuracao-no-android-e-estado-da-activity/