Modos de inicialização de Activity – standard
Em projetos reais, precisamos definir o modo de inicialização correto para cada Activity conforme os requisitos.
São quatro modos de inicialização:
standard, singleTop, singleTask e singleInstance
Configuramos o atributo launchMode da Activity no AndroidManifest.xml
standard é o modo padrão de inicialização
Se não escrever nada, todas as Activities usam esse modo por padrão
Nesse modo, cada nova Activity é colocada no topo da pilha
O sistema não verifica se essa Activity já existe na pilha.
Toda vez que for iniciada, uma nova instância da Activity é criada
Activity principal –> Activity comum —> abrir activity principal (nova)
Para essa nova activity principal, o sistema ignora a instância anterior
Vamos fazer uma demonstração abaixo
Adicione um botão na activity principal. No evento de clique desse botão, usamos Intent para abrir novamente a activity principal
Dúvida: parece que basta apertar voltar uma vez para sair do aplicativo
Ainda não sabemos o motivo disso
Se algum aluno descobrir, compartilhe com a turma.
Modos de inicialização de Activity – singleTop
Quando definimos o modo singleTop para uma Activity: ao iniciá-la, se ela já estiver no topo da pilha de retorno, reutilizamos essa instância e não criamos uma nova.
Vamos testar. No AndroidManifest.xml configuramos o atributo launchMode da activity principal como singleTop
Depois, não importa quantas vezes clicarmos no botão, nenhuma nova activity principal é criada, e o log aparece apenas uma vez.
Apertando o botão voltar uma vez, saímos do app Android
Mas se a Activity não estiver no topo da pilha, ainda assim pode ser criada uma nova instância
Vamos testar alterando o Intent, dessa vez vamos abrir
uma outra Activity, depois abrimos a activity principal a partir dessa segunda Activity.
O ponto principal: quando estamos na segunda Activity, o topo da pilha não é a activity principal, então nesse caso criamos uma nova activity principal.
I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.Code language: HTTP (http)
Problema: botão voltar abre a área de trabalho (das duas aulas anteriores)
Isso aconteceu porque colocamos uma linha finish(); extra no evento do botão
Log.e(TAG, this.toString()); usado para registrar o endereço de memória da Activity atual
Modo singleTask
Usando singleTask garantimos que só exista uma única instância dessa Activity em todo o aplicativo.
Já o singleTop só garante uma única instância quando ela está no topo da pilha.
Modo singleInstance e Tarefas Task
Nesse modo, o sistema cria uma nova pilha de retorno para gerenciar essa Activity
Por exemplo, temos três Activities. Se definirmos launchMode=singleInstance para a segunda Activity, ela será controlada por uma pilha de retorno separada.
Nesse cenário navegamos da primeira Activity para a segunda, depois da segunda para a terceira
Se apertarmos voltar na terceira Activity, voltamos primeiro para a primeira, pois a primeira e a terceira compartilham a mesma pilha de retorno.
Depois, ao apertar voltar na primeira Activity, vamos para a segunda. Nesse momento a pilha da primeira Activity está vazia, então o sistema pega o elemento do topo da outra pilha de tarefa do app, que é a Activity 2. Se apertar voltar novamente, voltamos para a área de trabalho.
public void onClick(View view){
Intent it = new Intent(AtividadeNormal.this,Atividade3.class);
startActivity(it);
finish();
}Code language: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/Atividade principal: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/Atividade comum: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/Terceira atividade: 113
Modos de inicialização de Activity