Activity – o que é isso?

Hoje iremos conhecer uma das mais importantes classes de uma aplicação Android: A classe Activity.

No post “Criando um projeto Android (Helloworld!)” comecei a falar sobre ela:

Uma Activity é basicamente uma classe gerenciadora de UI (Interface com o usuário). Todo aplicativo android começa por uma Activity.

Ou seja, quando uma aplicação android é executada, na verdade é a sua Activity principal que é lançada.

Ciclo de vida de uma Activity

Uma das coisas que é importante conhecer sobre a Activity é o seu ciclo de vida. E para explicá-lo, nada melhor do que o seguinte diagrama*:

Ciclo de vida de uma Activity

Ciclo de vida de uma Activity


Este diagrama é de fundamental importância para o correto entendimento do funcionamento de uma aplicação android. Ele introduz, implicitamente, os estados que uma Activity pode estar,  os quais explico no desenho abaixo:

Estados de uma Activity

Estados de uma Activity

Voltando ao diagrama do ciclo de vida, temos as seguintes funções:

  • onCreate() É a primeira função a ser executada quando uma Activity é lançada. Geralmente é a responsável por carregar os layouts XML e outras operações de inicialização. É executada somente uma vez durante a “vida útil” da Activity.

  • onStart() É chamada imediatamente após a onCreate() – e também quando uma Activity que estava em background volta a ter foco.

  • onResume() Assim como a onStart(), é chamada na inicialização da Activity (logo após a própria onStart())  e também quando uma Activity volta a ter foco. Qual a diferença entre as duas? A onStart() só é chamada quando a Activity não estava mais visível na tela e volta a ter o foco, enquanto a onResume() sempre é chamada nas “retomadas de foco”.

  • onPause() É a primeira função a ser invocada quando a Activity perde o foco (ou seja, uma outra Activity vem à frente).

  • onStop() – Análoga à onPause(), só é chamada quando a Activity fica completamente encoberta por outra Activity (não é mais visível).

  • onDestroy() A última função a ser executada. Depois dela, a Activity é considerada “morta” – ou seja, nao pode mais ser relançada. Se o usuário voltar a requisitar essa Activity, outro objeto será contruído.

  • onRestart() Chamada imediatamente antes da onStart(), quando uma Activity volta a ter o foco depois de estar em background.

Executando uma Activity

Já sabemos que quando a sua aplicação é executada, a Activity definida como padrão (na criação do projeto) é lançada. Mas eu posso criar outras Activities?

É claro que sim.

E para executar outras Activities, basta usar as funções startActivity() e startActivityForResult(). No exemplo abaixo, lançamos uma segunda Activity a partir da principal, e esperamos um resultado dela – como se fosse um retorno de função.

   static final int PICK_CONTACT_REQUEST = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startActivityForResult(
                new Intent(Intent.ACTION_CONTACT_REQUEST,
                new Uri("content://contacts")),
                CONTACT_REQUEST);
    }

    protected void onActivityResult(int requestCode, int resultCode, 
                                              Intent data) {
        if (requestCode == CONTACT_REQUEST) {
	    if (resultCode == RESULT_OK) {
	           // fazer alguma coisa...
		    }
		}
	}

Quando a segunda Activity terminar a sua execução, a função onActivityResult() será invocada, com o “resultado” como parâmetro.

Mas como uma Activity define o seu resultado, a ser lido por aquela que a chamou?

Isso é feito invocando-se a função setResult (int resultCode), como por exemplo:

setResult(Intent.RESULT_OK);

Alguém percebeu que eu não disse nada sobre os parâmetros da startActivityForResult()? Isso é porque este é o assunto do meu próximo post – o mecanismo de Uris em Android. Até lá!

Desenvolvendo para Android
*diagrama traduzido de http://developer.android.com/reference/android/app/Activity.html

37 respostas to “Activity – o que é isso?”

  1. Ricardo disse:

    olá Felipe,

    Estou acompanhando seu tutorial sobre Android e tive alguns pequenos problemas ao executar esse exemplo. Agora a pergunta é, esse código tá completo ??

  2. Felipe Silveira disse:

    Oi Ricardo! O codigo deste post ainda não está completo. O post que estou escrevendo, e devo postar até o fim da semana, trará a segunda parte, que irá completar o exemplo. Valeu!

  3. Claudio disse:

    Olá Felipe,

    Gostaria de saber como se faz para dar um tempo (sleep), antes de abriri uma outra Activity.

    Obrigado,

    Claudio

  4. Oi Cláudio,
    O que você pode fazer é criar uma thread que irá invocar essa Activity, e antes de lançar a Activity, colocar um sleep() com o tempo que você deseja de delay.

  5. Jailto Daniel disse:

    Olá Felipe,

    Fiquei com uma dúvida no seguinte trecho deste post:

    ” * onStop() – Análoga à onStart(), só é chamada quando a Activity fica completamente encoberta por outra Activity (não é mais visível).”

    Acredito que onde lê-se “onStart()” o correto seria “onPause()”. Estou correto ou será que não entendi corretamente o texto???

  6. Oi Jailto,

    Sim, você está certo… valeu por apontar o erro! acabei de corrigir!

    Valeu!!

  7. Nilber disse:

    Boa Noite

    No meu eclipse onde está as linhas: ACTION_CONTACT_REQUEST, new Uri(“content://contacts”)), CONTACT_REQUEST.

    Está retornando erro, o que pode ser?

    O eclipse diz que não existe as variáveis.

  8. Jorje disse:

    Ah não para de escrever não tá muito legal \o/

  9. Flavio disse:

    Olá Felipe,

    Também estou enfrentando os mesmos problemas que o Nilber.
    Aparentemente não existe o ACTION_CONTACT_REQUEST no objeto Intent.
    Como resolver?

    Obrigado, e parabéns pelo blog!

  10. Leonardo disse:

    Olá felipe boa tarde,
    estou com o mesmo problema do flávio e do Nilber.

  11. Max disse:

    eu estou com o mesmo problema do Flávio, do Nilber e do Leonardo!

  12. Douglas disse:

    Ola Felipe

    As classes corretas a serem importadas são: android.content.Intent e
    android.net.Uri.

    Pois se forem, então existe algum problema pois acusa a mesma mensagem que o Flávio, Nilber, Leonardo e Max comentaram.

  13. Oi Pessoal,

    Desculpem a demora, estive fora do blog nos últimos dias.

    Sim, conforme o Douglas mencionou, é necessário importar as classes android.content.Intent e android.net.Uri

    Obrigado!

  14. André disse:

    Parabéns pelos seus tutoriais,
    Consegui corrigir todos os erros, exceto pela parte do Uri…
    Assim que der, termine o post…

  15. João disse:

    Cara esta muito bom, mais spo falta vc especificar em que classe vc esta adicionando os códigos.
    Estou meio perdido onde coloca os códigos.

    Abraços.

  16. Valeu João!
    Esse codigo deve ser colocado na MainActivity.

    Obrigado!

  17. Olá Felipe,

    também não consegui executar o código. Está apresentando problemas no método “startActivityForResult”. Todos os parâmetros estão apresentando problemas.

    Poderia colocar para download o código que usou para esse exemplo?

  18. Pablo disse:

    Olá, Felipe!
    Estou com uma dúvida referente ao início das aplicações.
    Elas só podem iniciar por uma Activity?
    Não tem como começar por um Service, rodando em background?
    Não posso chamar um Service e iniciar meu aplicativo através de um BroadcastReceiver?
    Muito obrigado! Excelente post!

  19. Renato disse:

    Olá Felipe,

    Eu preciso de um sistema Dialer para o celular discar sozinho. Eu tenho o fluxograma dele. Você faz esse tipo de trabalho? Podemos conversar melhor sobre isso? Abraços.

  20. Leandro disse:

    Ola Felipe.

    Gostaria de saber se voce pode me aconselhar quanto a um projeto que gostaria de implementar.

    Estou usando um controlador multi eixo que trababa usando código G (G-code) devidadente parametrizado num planao carteziano (X;Y), minha alternativa hoje é usar um IHM que faz a interface das variáveis lógicas dentro deste controlador. Minha intenção era criar algo um pouco melhor ou seja colocar um tablet (Android) que possa gerar um view (visiualizador) deste código G na forma gráfica para que o operador do equipamento possa ver em tela a posição dos eixos antes, e ter uma ideia do que esta sendo executado no momento. Esta visualização e programação que esta um pouco complicada para mim pois sou técnico eletronico e na questão de software sei que é possivel porem estou lhe pedindo uma dica de como poderia fazer esta interface. O meu controlador tem entradada RS232,RS485 e Ethernet…quem poderia fazer isto ou se pela tecnologia disponivel HOJE é viável fazer isto.. aguardo seu comentário ou perguntas ref. ao meu projeto..
    Obrigado, Leandro

  21. Ataides Vieira Jr. disse:

    Amigo, estou começando a usar mas não estou tendo sucesso, minha aplicação fica carregando a interface do escrito android e não abre nada, eu consigo apenas ver o que eu estou fazendo se eu for no Eclipe na parte grafica do XML.

  22. Petros Schütz Schilling disse:

    Cara estou com um problema, eu importei as bibliotecas android.content.Intent;
    android.net.Uri;

    mas o eclipse continua não achando
    Intent.ACTION_CONTACT_REQUEST
    CONTACT_REQUEST
    entre outras propriedades

  23. Marco Aurelio disse:

    Muito bom seus tutoriais, estou aprendendo por curiosidade esta plataforma. Parabéns!

  24. Alisson M. Naimayer disse:

    Cara, muito bom, tive alguns probleminhas em alguns momentos, mas consegui resolver por minha própria conta.
    Nota: Estou aprendendo do zero apenas pelos seus posts. Parabéns, muito bem explicado!

  25. debora disse:

    ola, estou fazendo tcc, e tema eh audio livro para android , onde preciso converter um pdf para txt para o android falar o livro…sabe como posso fazer isto..estou cm mt dificuldade para descobrir

  26. ewerton disse:

    Beleza Felipe… estou acompanhando passa a passo… vamos ver o que vai dar…

  27. Caio disse:

    Galera, sempre usem o CTRL + SHIFT + O. Este comando adiciona as bibliotecas que vocês, porventura, não tenham inserido e que são necessárias. Por exemplo, se vc usa um comando para adicionar uma view e não insere pacore algum, ele acusará o erro. Inserindo o comando ele adicionará o import necessário para a aplicação rodar tranquilamente.

  28. Ricardo Alexandre Silveira disse:

    Bom dia Felipe, estou fazendo seu curso e está muito produtivo. Hoje estou deparada com uma problema que é. Como que eu posso chamar uma classe que criei quando iniciar o android sem intervenção de botões ?

    Fiz uma classe para conectar ao banco PostgreSQL mais me parece que a mesma não está sendo envocada, tentei fazer um botão para chama-lá mais não consegui fazer a interação.

    Obrigado desde já.

  29. JacksoNinja disse:

    Olá Pessoal estou com um projeto parado de um aplicativo Inédito, com 90% de chances de sucesso e 10% de Trabalho e 100% de lucro vale muito projeta-lo preciso de umas 4 pessoas pra formar uma equipe.

  30. Excelente artigo. Li todos e aprendi bastante coisa. São dicas que para quem tá começando é uma mão na roda. Obrigado.

  31. […] estendendo a classe “ListActivity”. “A ListActivity é uma classe filha da Activity cujo objetivo é mostrar ao usuário uma Lista (uma ListView). Em suma, é uma Activity com […]

  32. […] ListActivity é uma classe filha da Activity cujo objetivo é mostrar ao usuário uma Lista (uma ListView). Em suma, é uma Activity com alguns […]

  33. […] como as Activities, os Services são componentes fundamentais em um aplicação, possuindo ciclo de vida próprio. […]

  34. […] bem, este foi um dos conceitos que tive que aprender e encontrei uma boa explicação neste link (inclusive existe uma série de artigos sobre Desenvolvimento para Android) neste outro link temos […]

  35. Arthur de Arruda disse:

    Muito obrigado por compartilhar . É asssim que deve ser feito, explicando as funções.

Deixe um comentário