page.title=Iniciando uma atividade page.tags=ciclo de vida de atividade helpoutsWidget=true trainingnavtop=true @jd:body

Esta lição ensina a

  1. Entender o ciclo de vida do retorno de chamada
  2. Especificar a atividade da tela de início do aplicativo
  3. Criar uma nova instância
  4. Destruir a atividade

Leia também

Tente

Baixar a demonstração

ActivityLifecycle.zip

Diferente de outros paradigmas de programação em que os aplicativos são lançados com um método {@code main()}, o sistema Android inicia o código em uma instância {@link android.app.Activity} chamando métodos específicos de retorno de chamada que correspondem a determinados estágios do seu ciclo de vida. Há uma sequência de métodos de retorno de chamada que iniciam uma atividade e uma sequência de métodos de retorno de chamada que interrompem uma atividade.

Essa lição proporciona uma visão geral dos métodos do ciclo de vida mais importantes e mostra como lidar com o primeiro retorno de chamada do ciclo de vida que cria uma nova instância de sua atividade.

Entender o ciclo de vida do retorno de chamada

Durante a vida de uma atividade, o sistema chama um núcleo principal de métodos do ciclo de vida em uma sequência parecida com uma pirâmide em degraus. Isto é, cada estágio do ciclo de vida da atividade corresponde a um degrau da pirâmide. Conforme o sistema cria uma nova instância de atividade, cada método de retorno de chamada leva o estado da atividade um degrau acima. O topo da pirâmide é o ponto em que a atividade funciona em primeiro plano e o usuário pode interagir com ela.

Conforme o usuário começa a sair da atividade, o sistema chama outros métodos que a movem de volta em direção à base da pirâmide para desfazer a atividade. Em alguns casos, a atividade é movida parcialmente em direção à base da pirâmide e aguarda (como quando o usuário muda para outro aplicativo), no ponto em que a atividade é movida novamente em direção ao topo (se o usuário retornar à atividade) e reinicia de onde o usuário parou.

Figura 1. Ilustração simplificada do ciclo de vida da atividade, expressa como pirâmide em degraus. Isso mostra que, para cada retorno de chamada usado para levar uma atividade ao estado de Reiniciado, em direção ao topo, há um método de retorno de chamada que leva a atividade um degrau abaixo. A atividade também pode retornar ao estado de retomada do estado de Pausado e Interrompido.

Dependendo da complexidade de sua atividade, não há necessidade de implementar todos os métodos do ciclo de vida. No entanto, é importante compreender cada um e implementar apenas aqueles que garantem que seu aplicativo tenha o desempenho esperado pelo usuário. A implementação adequada dos métodos do ciclo de vida da atividade garante que seu aplicativo tenha um bom desempenho em vários sentidos, incluindo que:

Como você aprenderá nas lições seguintes, há várias situações de transições de atividades entre estados diferentes, como ilustrado na figura 1. No entanto, apenas três desses estados podem ser estáticos. Isto é, a atividade pode existir em um de apenas três estados por um período de tempo maior:

Reiniciado
Neste estado, a atividade está no primeiro plano e o usuário consegue interagir. (Também chamado de estado de funcionamento.)
Pausado
Neste estado, a atividade está parcialmente obscurecida por outra atividade. A outra atividade que está em primeiro plano é semitransparente ou não cobre totalmente a tela. A atividade pausada não recebe entrada do usuário e não executa nenhum código.
Interrompido
Neste estado, a atividade está completamente oculta e não é visível para o usuário. Considera-se que está em segundo plano. Enquanto interrompido, a instância da atividade e todas as informações de estado, como variáveis de membro, são retidas, mas não é possível executar nenhum código.

Os outros estados (Criado e Iniciado) são temporários e o sistema rapidamente se move rapidamente de um estado a outro chamando o próximo método de retorno de chamada do ciclo de vida. Isto é, depois que o sistema chama {@link android.app.Activity#onCreate onCreate()}, ele rapidamente chama {@link android.app.Activity#onStart()}, que é seguido por {@link android.app.Activity#onResume()}.

Isso é tudo que precisamos dizer sobre o ciclo de vida básico de atividades. Agora você aprenderá sobre alguns dos comportamentos específicos do ciclo de vida.

Especificar a atividade da tela de início do aplicativo

Quando o usuário seleciona seu aplicativo na tela inicial, o sistema chama o método {@link android.app.Activity#onCreate onCreate()} para {@link android.app.Activity} no aplicativo que foi declarado como atividade da “inicializador” (ou “principal”). Essa é a atividade que serve como ponto de entrada principal da interface do usuário do aplicativo.

É possível definir qual atividade será usada como principal no arquivo manifesto do Android, {@code AndroidManifest.xml}, que está na raiz do diretório do seu projeto.

A principal atividade do aplicativo deve ser declarada no manifesto com um {@code } que inclui a ação {@link android.content.Intent#ACTION_MAIN MAIN} e categoria {@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER}. Por exemplo:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Observação: ao criar um novo projeto do Android com ferramentas SDK Android, os arquivos padrões do projeto incluem uma classe {@link android.app.Activity} que é declarada no manifesto com esse filtro.

Se a ação {@link android.content.Intent#ACTION_MAIN MAIN} nem a categoria {@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} forem declaradas para uma de suas atividades, o ícone do aplicativo não aparecerá na lista de aplicativos da tela inicial.

Criar uma nova instância

A maioria dos aplicativos tem várias atividades que permitem ao usuário realizar diferentes ações. Tanto para a atividade principal criada quando o usuário clica no ícone do aplicativo quanto uma atividade diferente que o aplicativo inicia em resposta à ação do usuário, o sistema cria cada nova instância do {@link android.app.Activity} chamando o método {@link android.app.Activity#onCreate onCreate()}.

Implemente o método {@link android.app.Activity#onCreate onCreate()} para realizar a lógica básica de inicialização do aplicativo que deve acontecer apenas uma vez na vida completa da atividade. Por exemplo, sua implementação do {@link android.app.Activity#onCreate onCreate()} deve definir a interface do usuário e possivelmente instanciar algumas variáveis de escopo de classe.

Por exemplo, o seguinte modelo do método {@link android.app.Activity#onCreate onCreate()} mostra alguns códigos que realizam configurações fundamentais para a atividade, como declarar a interface do usuário (definida em arquivo de layout XML), definir variáveis de membro e configurar parte da interface do usuário.

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

Cuidado: utilizar {@link android.os.Build.VERSION#SDK_INT} para evitar que sistemas antigos executem novas APIs funciona apenas no Android 2.0 (API Nível 5) e versões posteriores. Versões mais antigas encontram uma exceção no tempo de execução.

Depois que o {@link android.app.Activity#onCreate onCreate()} termina de executar, o sistema chama os métodos {@link android.app.Activity#onStart()} e {@link android.app.Activity#onResume()} em rápida sucessão. A atividade nunca reside nos estados Criado ou Iniciado. Tecnicamente, a atividade se torna visível para o usuário quando {@link android.app.Activity#onStart()} é chamado, mas {@link android.app.Activity#onResume()} é executado e a atividade permanece no estado Reiniciado até que algo diferente ocorra, como o recebimento de uma chamada telefônica, o usuário navegar para outra atividade ou a tela do dispositivo desligar.

Nas próximas lições, você verá como outros métodos de inicialização, {@link android.app.Activity#onStart()} e {@link android.app.Activity#onResume()}, podem ajudar no ciclo de vida da atividade quando utilizado para reiniciar a atividade dos estados Pausado e Interrompido.

Observação: o método {@link android.app.Activity#onCreate onCreate()} inclui um parâmetro chamado savedInstanceState, que será discutido mais adiante na lição Recriando uma atividade.

Figura 2. Outra ilustração da estrutura do ciclo de vida da atividade com ênfase nos três retornos de chamada principais que o sistema chama na sequência quando cria uma nova instância da atividade: {@link android.app.Activity#onCreate onCreate()}, {@link android.app.Activity#onStart()} e{@link android.app.Activity#onResume()}. Depois que esta sequência de retornos de chamada for concluída, a atividade chega ao estado Reiniciado em que os usuários podem interagir com a atividade até que mude para outra atividade.

Destruir a atividade

Embora o retorno de chamada do primeiro ciclo de vida da atividade seja {@link android.app.Activity#onCreate onCreate()}, o último retorno de chamada será {@link android.app.Activity#onDestroy}. O sistema chama este método na atividade como o último sinal de que a instância da atividade está sendo completamente removida da memória do sistema.

A maioria dos aplicativos não exige a implementação desse método porque referências de classe locais são destruídas com a atividade, que realiza a maior parte da limpeza durante {@link android.app.Activity#onPause} e {@link android.app.Activity#onStop}. No entanto, se a atividade incluir threads de segundo plano criados durante {@link android.app.Activity#onCreate onCreate()} ou outro recurso de longa execução que pode vazar memória se não forem fechados adequadamente, você deve finalizá-los durante {@link android.app.Activity#onDestroy}.

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

Observação: o sistema chama {@link android.app.Activity#onDestroy} depois de ter chamado {@link android.app.Activity#onPause} e {@link android.app.Activity#onStop} em qualquer situação, exceto uma: quando você chama {@link android.app.Activity#finish()} pelo método {@link android.app.Activity#onCreate onCreate()} . Em alguns casos, como quando a atividade assume a posição temporária de tomadora de decisões para lançar outra atividade, chame {@link android.app.Activity#finish()} pelo {@link android.app.Activity#onCreate onCreate()} para destruir a atividade. Nesse caso, o sistema chama imediatamente {@link android.app.Activity#onDestroy} sem chamar qualquer outro método do ciclo de vida.