Concrete Logo
Hamburger button

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

  • Blog
  • 1 de Junho de 2018

Recentemente, falamos aqui no Blog sobre o que é uma Activity, como é iniciada e seu ciclo de vida básico. Hoje vamos falar 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? Fica tranquilo que é 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 pra 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 que 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 vão estar 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 post vimos como manter dados em uma Activity com recursos já amplamente utilizados. É importante lembrar que esta 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 voltamos para falar sobre Intents no Android: o que é e para que serve. Até lá!

A Concrete, parte da Accenture Technology, é referência em consultoria ágil, facilitando a transformação digital dos clientes ao criar produtos digitais inovadores. Só no capítulo Android contamos com 60 pessoas, que compartilham informações o tempo todo, em talks semanais e treinamentos frequentes. Nossos times têm autonomia para trabalhar e acesso direto aos gerentes, o que facilita a troca de conhecimento e a constante evolução técnica. Quer trabalhar com os melhores? Acesse: concrete.com.br/vagas