segunda-feira, setembro 24, 2012

Desenvolvendo para Android: Introdução às Activities

Uma Activity no Android corresponde, grosseiramente, a uma tela. Do ponto de vista da programação, é uma classe a partir da qual vamos derivar as nossas classes que irão implementar a maioria das nossas telas.

A rigor existem quatro componentes que podemos usar (isoladamente ou em conjunto) para criar uma aplicação: Activity, Service, BroadcastReceiver e ContentProvider. O mais comum são aplicações que utilizam Activities.

As Activities são criadas pelo sistema operacional, através de Intents (vou falar mais sobre eles em outro post). Tipicamente a primeira Activity de uma aplicação é criada quando o usuário a dispara, as demais são criadas por solicitação da própria aplicação.

Para que o sistema operacional possa criar as Activities, elas devem ser declaradas no manifesto da aplicação. No mínimo devem ser declarados o nome e a classe que a implementa, opcionalmente pode-se configurar várias características da Activity.

Ciclo de Vida de uma Activity


A figura acima (copiada da documentação do Android e que você pode ampliar clicando) aparece em todos os livros sobre Android. Os onXxxx() são métodos que você pode sobrepor para tratar a entrada nos vários estados. Inicialmente eu julguei esta informação como interessante mas de pouca utilidade. Grave engano.

O ponto mais importante do ciclo de vida é entender que você tem pouco controle sobre ele, particularmente a criação e destruição da sua Activity. Um caso particular importante é a rotação da tela. Quando o usuário vira o aparelho, o padrão é o Android destruir e recriar a sua Activity para te dar a oportunidade de criar uma interface específica para a nova orientação.

No meu caso a aplicação iria sempre rodar em um tablet na posição horizontal (landscape). Uma configuração (android:screenOrientation="landscape") no manifesto permite forçar a orientação da Activity, portanto ela não era mais afetada quando o aparelho era virado. E aí eu fiz a besteira de colocar no OnCreate de uma Activity o avanço para o próximo registro a apresentar.

O problema ocorreu quando o tablet "desligava" automaticamente (na verdade ele não desliga, apenas suspende a execução de uma série de coisas para economizar energia). Como parte deste "desligar" o Android forçava uma rotação da tela. O resultado era que quando se "religava" o tablet a aplicação ia para o registro seguinte. Uma forma de contornar isto é dizer no manifesto que a sua Activity sabe tratar mudanças de orientação (android:configChanges="orientation"). É claro que a solução correta é retirar o avanço de registro da criação da Activity.

O moral é que a sua Activity pode ser destruída ou criada a qualquer momento e a sua lógica precisa ser imune a isto.

Nenhum comentário: