Compreender o ciclo de vida de uma Activity é essencial — isso permite que você escreva aplicativos fluidos
E ainda ajuda a gerenciar os recursos do app de forma mais eficiente.
Proporcionando uma melhor experiência ao usuário.
As activities no Android podem ser empilhadas umas sobre as outras.
Toda vez que você inicia uma nova activity, ela cobre a anterior.
Em seguida, ao pressionar o botão voltar, a activity atual é destruída e a anterior reaparece.
Na verdade, o Android usa algo chamado Tarefa (Task) para gerenciá-las.
Uma tarefa é basicamente um conjunto de activities armazenadas em uma pilha.
Essa pilha é conhecida como Back Stack (pilha de retorno).
Uma pilha é uma estrutura de dados do tipo LIFO (último a entrar, primeiro a sair).
Por padrão, sempre que você inicia uma nova activity, ela é empilhada no topo.
Quando você pressiona o botão voltar ou executa finish(), a activity no topo da pilha é destruída. A activity anterior volta para o topo. O sistema sempre exibe ao usuário a activity que está no topo da pilha.
Estados de uma Activity
Ao longo do seu ciclo de vida, uma activity pode estar em até quatro estados diferentes.
1. Estado em execução
Quando está no topo da pilha, o sistema reluta em recuperá-la, pois isso prejudicaria a experiência do usuário.
2. Estado pausado
Não está no topo da pilha, mas ainda é visível — por exemplo, quando a activity atual abre uma activity de diálogo que ocupa apenas parte da tela, semelhante a uma janela modal. O sistema também evita recuperá-las, pois desaparecer de repente seria confuso para o usuário.
3. Estado parado
Uma activity entra nesse estado quando não está no topo da pilha e fica completamente invisível. O sistema preserva seu estado e variáveis de membro, mas isso não é garantido — se precisar de memória em outro lugar, o sistema pode recuperar essas activities.
4. Estado destruído
Quando uma activity é removida da pilha de retorno, passa ao estado destruída. O sistema prioriza a recuperação dessas activities para liberar memória.
Tempo de vida da activity e sete métodos de callback
A classe Activity define sete métodos de callback que cobrem cada etapa do ciclo de vida.
Resumindo: essas sete funções de callback são acionadas em momentos específicos do ciclo de vida e executam seu código.
Por exemplo, onCreate é acionado quando a activity é criada pela primeira vez.
Abaixo estão os sete métodos:

onCreate:
Chamado quando a activity é criada pela primeira vez. Aqui você faz a inicialização — carrega o layout, vincula eventos aos botões, etc.
onStart:
Acionado quando a activity passa de invisível para visível.
onResume:
Chamado quando a activity está pronta para interagir com o usuário. Neste momento, está no topo da pilha de retorno e em estado de execução (já está visível para o usuário).
onPause:
Invocado quando o sistema está prestes a iniciar ou retomar outra activity. Geralmente você libera recursos que consomem CPU e salva dados importantes aqui, mas a execução deve ser rápida — caso contrário, atrasará a exibição da nova activity. (A activity atual está prestes a ser ocultada, a transição ainda não terminou.)
onStop:
Chamado quando a activity fica completamente invisível. A diferença principal em relação a onPause é que, se a nova activity for do tipo diálogo, onPause será executado, mas onStop não. (A activity é ocultada e a nova aparece.)
onDestroy:
Chamado logo antes da activity ser destruída. Depois disso, ela entra no estado destruída.
onRestart:
Chamado logo antes de uma activity parada voltar ao estado em execução — ou seja, quando a activity é reiniciada.
Três tipos de tempo de vida
Dos sete métodos acima, todos exceto onRestart formam pares. Portanto, podemos dividir o tempo de vida da activity em três categorias.
1. Tempo de vida completo
Tudo o que acontece entre onCreate e onDestroy constitui o tempo de vida completo.
2. Tempo de vida visível
O período entre onStart e onStop é o tempo de vida visível. A activity permanece visível para o usuário. Você pode usar esses métodos para gerenciar recursos com inteligência — por exemplo, carregar recursos em onStart e liberá-los em onStop, garantindo que activities paradas não ocupem memória desnecessária.
3. Tempo de vida em primeiro plano
O período entre onResume e onPause é o tempo de vida em primeiro plano. A activity está em execução e pode receber a entrada do usuário. É o estado com o qual os usuários interagem com mais frequência.
Abrir activity principal → entrar na activity normal → voltar à activity principal → voltar à tela inicial
05-12 15:32:43.899 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onCreate:
05-12 15:32:43.926 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStart:
05-12 15:32:43.930 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onResume:
05-12 15:33:00.973 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onPause:
05-12 15:33:01.078 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onCreate:
05-12 15:33:01.079 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onStart:
05-12 15:33:01.081 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onResume:
05-12 15:33:02.969 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStop:
05-12 15:34:01.747 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onPause:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onRestart:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStart:
05-12 15:34:01.780 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onResume:
05-12 15:34:02.749 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onStop:
05-12 15:34:02.750 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onDestroy:
05-12 15:35:26.827 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onPause:
05-12 15:35:28.534 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStop:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onDestroy:
Prática de projeto
Vamos criar um novo projeto para experimentar o ciclo de vida
Vamos chamar a activity de LifeDemo.
Adicione uma EmptyActivity como activity principal.
Depois adicione mais duas activities: NormalActivity e DialogActivity.
Em seguida, modifique seus layouts.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity normal" />
</LinearLayout>Code language: HTML, XML (xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity de diálogo" />
</LinearLayout>Code language: HTML, XML (xml)
Os layouts são praticamente idênticos, mudando apenas o texto exibido.
Também precisamos transformar a DialogActivity em uma activity de diálogo.
Modifique o AndroidManifest.xml:
<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity" android:theme="@style/Base.Theme.AppCompat.Dialog"/>
</application>Code language: HTML, XML (xml)
Isso define o tema de diálogo para a DialogActivity.
Layout da activity principal
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Abrir activity normal" />
<Button
android:id="@+id/buttondialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Abrir activity de diálogo" />
</LinearLayout>Code language: HTML, XML (xml)
Adicionar eventos de clique aos dois botões da activity principal
package com.foxdevelop.www.lifedemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button)findViewById(R.id.button);
b.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View view){
Intent it = new Intent(MainActivity.this,NormalActivity.class);
startActivity(it);
}
}
);
Button b2 = (Button)findViewById(R.id.buttondialog);
b2.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View view){
Intent it = new Intent(MainActivity.this,DialogActivity.class);
startActivity(it);
}
}
);
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart: ");
}
}Code language: JavaScript (javascript)
1. Executar o aplicativo
Ao criar a activity principal, onCreate, onStart e onResume são executados em ordem.

Ao tocar em “Abrir activity normal”, onPause e onStop são acionados.

Como a NormalActivity cobre completamente a MainActivity, ambos os métodos são chamados.
Pressione o botão Voltar para retornar.

Como a MainActivity estava no estado parado, onRestart é acionado, seguido de onStart e onResume.
Mas onCreate não é executado, pois a activity não foi recriada. Neste momento, a NormalActivity deve ter acionado seu próprio onDestroy.
Agora toque em “Abrir diálogo”.
Desta vez, apenas onPause é acionado.
Você notará que onStop não foi acionado.
Isso ocorre porque a DialogActivity não oculta completamente a MainActivity.

Da mesma forma, se você pressionar Voltar agora, apenas onResume será executado. Como não foi parada, onStart não é chamado.


Como você pode ver, aqui onPause, onStop e depois onDestroy são acionados.
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.Code language: CSS (css)
Activity principal criada → activity de diálogo aberta → voltar à activity principal → voltar à tela inicial
05-13 02:10:51.635 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onCreate: // Criar nova activity
05-13 02:10:51.673 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onStart: // De invisível para visível
05-13 02:10:51.701 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onResume: // Activity está visível
05-13 02:12:01.993 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onPause: // Saindo da activity atual para outra
05-13 02:12:02.115 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onCreate:
05-13 02:12:02.116 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onStart:
05-13 02:12:02.143 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onResume:
05-13 02:14:26.078 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onPause: // Botão voltar, retornando à activity principal
05-13 02:14:26.367 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onResume: // Aparece direto pois não foi parada
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onStop: // Activity de diálogo não está mais visível
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onDestroy: // Por ser voltar ou finish() ela é destruída
05-13 02:16:23.959 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onPause:
05-13 02:16:25.606 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onStop:
05-13 02:16:25.609 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onDestroy: // Antes de qualquer destruição, sempre ocorre pause e stopCode language: JavaScript (javascript)
O ciclo de vida de uma Activity